闭包
闭包:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包”。
通俗解释:主体函数中嵌套一个函数,将嵌套函数返回到主体函数之外,利用返回的嵌套函数访问主体函数中的局部变量。
代码解释:
示例1
function checkscope() {
var scope = 'local scope';
function f() {
return scope;
}
return f();
}
// 返回checkscope()函数内部的 f 函数的调用结果,即返回局部变量scope
checkscope(); // 返回 'local scope'
示例2
function checkscope() {
var scope = 'local scope';
function f() {
return scope;
}
return f;
}
// 返回checkscope()函数内部的f函数对象,f的调用结果,即返回局部变量scope
checkscope()(); // 返回 'local scope'
上面两个简单示例展示如何应用函数内部局部变量(闭包),也可以在主体函数中返回多个函数(用对象),不同函数用不同的方式操作局部变量。
创建多个闭包时,容易产生的错误
function constfuncs() {
var funcs = [];
for(var i=0; i<10; i++) {
funcs[i] = function() {
return i;
}
}
return funcs;
}
var funcs = constfuncs();
funcs[5](); // 返回值是什么?
1、函数中变量 i 的值:constfuncs()函数调用结束,i 最后的值为10;
2、funcs 数组中的值:constfuncs()函数调用时,内部创建了10个函数 function() { return i ; },这10个函数没有执行,只是存储到数组中,下标 0 - 9;
3、funcs[5]() 返回值:funcs[5] 是创建的10个函数中的一个,调用时返回 i,此时constfuncs()函数运行结束,i 值为10,所以funcs[5]() 返回值 是10;