1 变量的作用域
通俗的理解,可以理解为变量的有效领域,有点类似C++,java中的局部变量和全局变量的概念。
var scope = "global"; function checkscope(){ var scope = "local"; return scope; } checkscope();
上述程序中,首先定义了一个全局变量scope,该变量在整个全局中都是有效的,在函数checkscope内部也能访问,同时,函数checkscope内部也定义了一个变量scope,该变量的作用域只存在于函数checkscope中,只能在函数checkscope中进行访问。如果函数checkscope中没有定义scope局部变量,那么返回的scope的值是global,但局部变量优先级是大于全局变量的,所以返回的值是local。
2 函数作用域
首先,我们看一个简单的例子:
var scope = "global"; function f(){ console.log(scope); var scope = "local"; console.log(scope); }
结果是undefined,local,为什么呢? js的函数作用域是指在函数中声明的所有变量在函数体中始终是可见的,更有意思的是,变量在声明之前就可以使用。
这个特性被称为声明提前(hosting)。所以,程序执行到第一个console.log(scope)时,局部变量scope已经被定义了,但是没有赋值,所以是undefined。
再接下来,看一个复杂一点的例子:
var o = "a"; function test(o){ var i = 0; if(typeof o == "object"){ var j = 1; for(var k = 0; k < 10; k++){ console.log(k); } console.log(k); } console.log(j); } test(o);
结果是undefined。
在上述代码中,变量i,j,k都在同一作用域中,这三个变量在函数体中都是有定义的。
3 块级作用域
for(var i = 0; i < 10; i++){ doSomething(i); } alert(i);
如果在java中,for运行完后,会摧毁i,但JavaScript不会,如果想for运行完后,摧毁i,可以用es6语法中的let,如下:
for(let i = 0; i < 10; i++){ doSomething(i); } alert(i);
此时,在for循环外访问i,会报错。