闭包是js中的重点,也是一个较难理解的一个点,但是其应用却很广,故而理解并正确使用闭包是很有必要的。
定义:有权访问另一个函数作用域中的变量的函数。
如下,我想获取 test 的值,即输出test
function init() {
var test =test;
}
var result = test;
console.log(result);
输出的结果是 not defined,是无法访问函数内的变量,使用闭包的情况下
function init() {
var test ="test";
return function () {
return test;
}
}
var result = init()();
console.log(result);
输出的结果就是函数的局部变量 test的值,[调用init时要两个小括号对,第一对时立即执行init,此时返回的是一个匿名函数,要立即执行这个匿名函数,需要加一对小括号,所以需要两对小括号]
来看看下面的程序输出
function func() {
var result = new Array;
for(var i = 0;i<10;i++){
result[i] = function () {
return i ;
}
}
return result;
}
var results = func();
results.forEach(function (element) {
console.log(element());
});
result 最后输出的是10个10,并不是保存的0-9,这是由于result中保存是的同一个匿名函数的引用,而匿名函数就是闭包的表现形式,闭包中的变量是保存的匿名函数外部的变量 i ,当我们去调用的时候,变量 i 的值已经增加到 10了 ,即保存的是作用域链上的最终结果,所以想要实时输出 i 变量的值,必须立即执行闭包匿名函数。
function func() {
var result = new Array;
for(var i = 0;i<10;i++){
result[i] = function (num) {
return num ;
}(i)
}
return result;
}
var results = func();
results.forEach(function (element) {
console.log(element);
});
此时输出的就是0-9,可以对比两个程序输出的方式,第一个是element(),第二个是element,由于第二个程序中,匿名函数立即执行了,result中存的是返回的num的值,而不是匿名函数的应用了。
当然书上用这个例子,想说明的是闭包中的变量保存的是其作用域链上的终值。