【发布时间】:2017-10-20 09:18:07
【问题描述】:
我了解大多数闭包是什么,但是这个例子让我很困惑。我将发布两个代码示例:第一个将是他们解释闭包工作原理的原始引用,第二个将是我添加一些内容的代码,但它没有给我预期的结果。
这是他们给出的解释:
最后一个例子表明,每次调用都会创建一个单独的闭包 局部变量。每个函数没有一个闭包 宣言。每次调用函数都有一个闭包。
实际代码:
function newClosure(someNum, someRef) {
// Local variables that end up within closure
var num = someNum;
var anArray = [1,2,3];
var ref = someRef;
return function(x) {
num += x;
anArray.push(num);
console.log('num: ' + num +
'; anArray: ' + anArray.toString() +
'; ref.someVar: ' + ref.someVar + ';');
}
}
obj = {someVar: 4};
fn1 = newClosure(4, obj);
fn2 = newClosure(5, obj);
fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;
fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;
obj.someVar++;
fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;
fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;
现在,我不明白为什么 obj.someVar++ 会更改最后两行的结果,并且以下添加 num++ 不会将最后两个 num 结果更改为 8 和 9 而不是 7 和 8。有什么区别?
function newClosure(someNum, someRef) {
// Local variables that end up within closure
var num = someNum;
var anArray = [1,2,3];
var ref = someRef;
return function(x) {
num += x;
anArray.push(num);
console.log('num: ' + num +
'; anArray: ' + anArray.toString() +
'; ref.someVar: ' + ref.someVar + ';');
}
}
num = 4
obj = {someVar: 4};
fn1 = newClosure(num, obj);
fn2 = newClosure(num+1, obj);
fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;
fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;
num++
obj.someVar++;
fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;
fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;
谁能给我解释一下?
【问题讨论】:
标签: javascript function closures