1、作用域、嵌套函数和闭包
在JavaScript中,只有函数具有作用域。下面示例说明了JavaScript中作用域的特点:
function foo(){
var a = 10;
function bar(){
a* = 2;
}
bar();
return a;
}
当bar在foo中被调用时它能够访问a,这可以理解。但是如果bar是在foo外部被调用呢?
function foo(){
var a = 10;
function bar(){
a* = 2;
return a;
}
return bar; //返回的是一个指针而不是函数
}
var baz = foo(); //baz is now a reference to function bar.
baz(); //return 20.
baz(); //return 40;
baz(); //return 80.
var blat = foo(); //blat is another reference to bar.
blat(); //retruns 20,because a new copy of a is being used.
函数是运行在定义它们的作用域中(本例中是foo内部的作用域),而不是运行在调用它们的作用域。只要bar被定义在foo中,它就能访问在foo中定义的所有变量,即使foo的执行已经结束。
这即使闭包的一个例子。在foo返回后,它的作用域被保存下来,但只有它返回的那个函数能够访问作用域。在示例中,baz和blat各有这个作用域及a的一个副本,而且只有他们自己能对其进行修改。返回一个内嵌函数是创建闭包最常用的手段。