在下面的例子中JavaScript闭包如何工作?
这个问题在这里已经有了答案:
你需要传入5
作为unknown
。
关闭完整性的简要定义
从这个SO链接
数字是在JavaScript中传递值
的b
传递给自变量a()
被保存在封闭该a
回报。 所以在你的例子中, b
被保存为x
或2
的值。 这是因为JavaScript中的Number
是按值传递的。 这意味着,改变x
不改变的值b
的闭包内a
回报。
简洁的例子:
var a = function(x) {
return function() {
return x + 1;
};
};
var x1 = 1;
var fn1 = a(x1); // x1 is passed by value, so x inside the closure is its own copy of 1
x1 = 2 // no effect on the next line
console.log(fn1()) // prints 2, does NOT print 3
我听到的最简单的封闭描述是:
这是一种功能无限期地访问创建环境的方式。
所以在:
var a = function(b) { /* "outer" aka "functionofb" */
return function(c) { /* "inner" aka "functionofc" */
return y + b + c;
}
};
我们要看看如何让内部函数无限期地访问变量'b'(的副本),就像它在内部出现时一样。 (在这个例子中,内部函数永远不会改变'b'副本的值,但它可以。)
因此,通过您的示例,让我们开始在这里:
x = 2;
var fn = a(x);
变量a“指向”一个未命名(匿名)函数(用'b'作为arg的函数),所以这基本上是:
fn = functionofb(x);
要么 :
fn = functionofb(2);
现在'functionofb'是一个返回函数的函数。 它返回的函数是:
function(c) {
return y + b + c;
}
(这也是匿名的,所以我们称之为`functionofc')
所以:
function(c) {
return y + 2 + c; /* here 'b's value is 'captured' by the closure */
}
然后我们有:
y = 3;
并做:
fn(5);
这只是:
functionofc(5);
这给了我们:
return y + 2 + c;
要么:
return 3 + 2 + 5; /* 'y' was never captured, the current value is used */
这是所需的答案:
10
其他一切都只是红鲱鱼。
有关JavaScript闭包的更完整讨论,请参阅JavaScript闭包如何工作?
当你这样做...
var fn = a(x);
...变量fn
变成等于...
function(c) {
return y + 2 + c;
}
...因为此时x
等于2,并且执行函数a
时x
的值被捕获(固定)。
所以,当你在运行函数fn
那一刻执行变量y
等于3的fn(5)
时,这意味着函数会执行此操作...
return 3 + 2 + 5;
由于3 + 2 + 5 = 10,这意味着你的输出是10。
注1:
如果你在y = 3;
之前跑了它, fn(5)
会返回12 y = 3;
,因为当时y
的值是5。 看这个小提琴演示。
笔记2 :
有关闭包的更多信息,请参阅此问题:
JavaScript关闭如何工作?
链接地址: http://www.djcxy.com/p/1487.html上一篇: How does JavaScript closure work in the following example?