如何理解Javascript中的闭包?
一般而言,闭包是绑定到一个或多个外部变量的函数。调用它时,该函数可以访问这些变量。在JavaScript中,当函数在另一个函数内声明时,通常会实现闭包。即使在父函数终止后,内部函数也会访问父函数的变量
在这个语句中,“闭包是一个绑定到一个或多个外部变量的函数”,这是否意味着我们可以这样做:var myFun = Function(msg){...};
它是否正确?
“即使在父函数终止后”是什么意思?
答案 0 :(得分:7)
闭包是一个绑定到一个或多个外部变量的函数
这个概念的一个例子是功能栏绑定到外部变量x,y和z:
function foo(x, y) {
var z = 3;
return function bar(a, b, c) {
return (a + b + c) * (x + y + z);
};
}
var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24
变量closure
是指从bar
调用返回的内部函数foo
。调用closure
就像重新进入foo
中的范围一样,可以查看所有foo
的局部变量和参数。
即使在父函数终止后
这意味着在执行foo
之后,存储在closure
变量中的返回函数将保持状态foo
。您甚至可以通过再次调用foo
来创建多个独立的闭包:
var closure = foo(1, 2);
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24
var closure2 = foo(0, 0);
closure2(5, 6, 7); // (5 + 6 + 7) * (0 + 0 + 3) = 21
/* closure2 does not affect the other closure */
closure(5, 6, 7); // (5 + 6 + 7) * (1 + 2 + 3) = 24
答案 1 :(得分:2)
您对外部变量的解释不正确。这实际上意味着它可以做到这一点:
function make_closure()
{
var x = 20;
return function()
{
alert(x);
};
}
var closure = make_closure();
closure(); // Displays 20
答案 2 :(得分:2)
我不确定你在哪里引用,但听起来它在父功能运行完毕时就引用了。