答案 0 :(得分:2)
闭包是变量的容器,它允许函数从创建它的作用域访问变量,即使它在不同的作用域中被调用。
示例:
function a() {
// a local variable
var x = 42;
function f() {
// use the local variable
return x;
}
// return the function f
return f;
}
// call a to get the inner function
var fx = a();
// call the inner function from out here
var y = fx();
// now y contains the 42 that was grabbed from the variable x inside the function
当创建函数f
时,它有一个闭包,它包含来自创建它的作用域的变量x
。当从全局范围调用该函数时,它仍然可以从本地范围访问变量x
,就像它在闭包中一样。
您可以通过将变量放在对象中来模拟闭包的功能,并将其与函数一起发送,以便函数可以在以后使用它:
function a() {
// a "closure"
var o = { x: 42 };
function f(closure) {
// use the "closure"
return closure.x;
}
// return the "closure" and the function f
return { f: f, o: o };
}
// call a to get the inner function and the "closure"
var fx = a();
// call the inner function with the "closure"
var y = fx.f(fx.o);
// now y contains the 42 that was grabbed from the variable x in the "closure"
注意:闭包包含作用域中的任何标识符,因此在第一个示例中,函数f
的闭包还包含作为函数的标识符f
。该函数可以从任何地方使用名称f
调用自身,但标识符f
是函数a
的本地名称。