失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > JavaScript作用域(scope)

JavaScript作用域(scope)

时间:2019-02-20 10:57:57

相关推荐

JavaScript作用域(scope)

文章目录

前言一、全局作用域二、函数作用域1.在函数作用域中可以访问到全局作用域的变量2.在全局作用域中无法访问到函数作用域的变量3.就近原则4.在函数作用域中有声明提前的特性5.在函数中,不使用var声明的变量都会成为全局变量

前言

作用域即一个变量的作用范围,在js中作用域分为全局作用域和函数作用域


一、全局作用域

——直接编写在script标签中的js代码,都在全局作用域——全局作用域在页面打开时创建,在页面关闭时销毁——在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用

在全局作用域中

创建的变量都会作为window对象的属性保存

创建的函数都会作为window对象的方法保存

var box = 'blue';function setBox() {alert(window.box);//全局变量即window的属性}window.setBox();//全局函数即window的方法

全局作用域中的变量都是全局变量,即在页面的任意位置都可以访问的到

二、函数作用域

——调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁——每调用一次函数就会创建一个新的作用域,他们之间是相互独立的

1.在函数作用域中可以访问到全局作用域的变量

var a=100;function fun(){var b=200;//在函数作用域中访问全局作用域中的变量console.log(a);//100}fun();

2.在全局作用域中无法访问到函数作用域的变量

var a=100;function fun(){var b=200;}//在全局作用域中访问函数作用域中的变量console.log(b);//Uncaught ReferenceError: b is not defined

3.就近原则

当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用,如果没有,则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依然没有找到,则会报错ReferenceError(就近原则

var a = 10;// 全局作用域var b = 20;function fun(x){// 局部作用域var a = 100;var c = 200;console.log("fun"+ a, b, c, x);//fun100 20 200 50function bar(x){var a = 1000;d = 300;console.log("bar"+ a, b, c, d, x);//bar1000 20 200 300 20}bar(20);}fun(50);

在上面这个例子中var a, var b 是全局作用域对象,fun是函数作用域对象,而 bar 则是嵌套在 fun 函数内部的作用域。

bar函数作用域内输出方法有个输出 b,但 bar作用域内没有 b这个变量,就往上一层 fun 作用域内进行查找,再没有就往再上一层,查找直到顶层为止,如果顶层还没有,就抛出异常(其执行顺序是由内向上,一级一级查找的)

函数内部作用域可以向上逐级查找,是因为顶层对象(属性,变量)对底层对象可见的,反之顶层对象,不能看到底层对象

——在函数中要访问全局变量可以使用window对象(window.a)

4.在函数作用域中有声明提前的特性

使用var关键字声明的变量会在函数中所有的代码执行之前被声明。下面这两段代码其实完全相同

function fun(){console.log(a);var a=35;}fun();//undefined

function fun(){var a;console.log(a);a=35;}fun();//undefined

5.在函数中,不使用var声明的变量都会成为全局变量

var a = 30;function fun() {a = 20;b = 100;//相当于window.d = 100;是一个全局变量}fun(); console.log("a = " + a);//a = 20console.log("b = " + b);//b = 100

如果觉得《JavaScript作用域(scope)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。