function f1(){
var n=999;
nAdd=function(){n+=1;};
function f2(){
alert(n);
}
return f2;
}
var result = f1();
var result2 = f1();
result(); // 999
nAdd();
result2(); // 1000
result2(); // 1000
result(); // 999
我正在尝试学习 JavaScript 闭包,但上面的代码让我感到困惑。
当第一次调用 result()
时,它是 999。这对我来说没问题。
在 nAdd()
被调用后,result2()
显示 1000。我认为这是由于函数 result2()
和函数result()
等于函数 f1()
。
但为什么最后一个result()
显示的是999而不是1000?
最佳答案
每次 f1()
被调用都会创建一个新的闭包,它有自己的本地 n
变量。
但是,nAdd
变量是全局变量,因此每次调用 f1()
时都会被覆盖 - 这意味着调用 nAdd()
只会添加到 last 闭包中的 n
变量。
更新:如果您希望能够在每个闭包中独立地增加 n
的值,您可以这样做:
function f1(){
var n=999;
return {
incrementN : function(){n+=1;},
getN : function f2(){console.log(n);}
}
}
var result = f1();
var result2 = f1();
result.getN(); // 999
result.incrementN();
result2.getN();//999
result2.incrementN();
result2.getN();//1000
result.getN();//1000
也就是说,让 f1()
返回一个对象,其中包含两个未声明为全局变量的方法,并且这两个方法都对闭包中的局部 n
变量进行操作属于。
关于javascript - 一个 JavaScript 闭包混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19677879/