在了解javascript闭包的同时,我在stackoverflow上遇到了这个答案 https://stackoverflow.com/a/111111/3886155 。 这是封闭的一个非常好的解释。 但我在示例4 和示例5 中有一些困惑。
我只是在这里复制整个片段:
示例4:
var gLogNumber, gIncreaseNumber, gSetNumber;
function setupSomeGlobals() {
// Local variable that ends up within closure
var num = 666;
// Store some references to functions as global variables
gLogNumber = function() { console.log(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}
setupSomeGlobals();
gIncreaseNumber();
gLogNumber(); // 667
gSetNumber(5);
gLogNumber(); // 5
var oldLog = gLogNumber;
setupSomeGlobals();
gLogNumber(); // 666
oldLog() // 5
在阅读了一些例子后,我可以说每当函数内部的函数执行时,它总能记住外部函数内部声明的变量。
我同意,如果这些闭包变量仍然更新,它仍然引用新的变量值。
我在这个示例中的问题与var oldLog=gLogNumber;
特别相关
如何在致电setupSomeGlobals();
后返回旧号码?
因为现在var num
已经重置了。为什么它没有使用这个新的num值666?
现在示例5:
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + i;
result.push( function() {console.log(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// Using j only to help prevent confusion -- could use i.
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
这里他们将函数推入数组并在循环结束后执行它们。但是现在对闭包变量的引用是循环结束后的最新变量。为什么不是旧的?
在这两个例子中,你只是将函数定义分配给变量或数组索引。但是第一个指向旧的,第二个指向最新的。为什么?
答案 0 :(得分:0)
如何在调用setupSomeGlobals()
后返回旧数字
num
不是全局范围的,因此值num
位于调用gLogNumber
的引用的上下文中。
再次调用setupSomeGlobals
方法后,对gLogNumber
的引用发生了变化。试试这个
console.log(Object.is( gLogNumber, oldLog )); //true
setupSomeGlobals();
console.log(Object.is( gLogNumber, oldLog )); //false
因此,oldLog
保留了旧的引用,因此保留了num
的旧值,但gLogNumber
获得了新的num
。
但现在引用闭包变量是最新的一个 循环结束。为什么不老?
对于这个问题,请看一下