如何理解 Javascript 中的闭包?
一般而言,闭包是绑定到一个或多个外部变量的函数。当它被调用时,该函数能够访问这些变量。在 JavaScript 中,当函数在另一个函数中声明时,通常会实现闭包。内部函数访问父函数的变量,即使在父函数终止后
在这句话中,“闭包是绑定到一个或多个外部变量的函数”,这是否意味着我们可以这样做:对var myFun = Function(msg){...};
吗?
“即使在父函数终止之后”是什么意思?
如何理解 Javascript 中的闭包?
一般而言,闭包是绑定到一个或多个外部变量的函数。当它被调用时,该函数能够访问这些变量。在 JavaScript 中,当函数在另一个函数中声明时,通常会实现闭包。内部函数访问父函数的变量,即使在父函数终止后
在这句话中,“闭包是绑定到一个或多个外部变量的函数”,这是否意味着我们可以这样做:对var myFun = Function(msg){...};
吗?
“即使在父函数终止之后”是什么意思?
闭包是绑定到一个或多个外部变量的函数
这个概念的一个例子是函数 bar 绑定到外部变量 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
您对外部变量的解释不正确。这真的意味着它可以做到这一点:
function make_closure() {
var x = 20;
return function() {
console.log(x);
};
}
var closure = make_closure();
closure(); // Displays 20
我不确定你从哪里引用,但听起来它是在父函数完成运行时引用的。