【问题标题】:Updating contextual array in Javascript closure在 Javascript 闭包中更新上下文数组
【发布时间】:2014-01-07 08:47:55
【问题描述】:
我有这段简单的代码:
function test(){
var test_array = []
return function(i){
test_array.push(i);
alert(test_array.length);
};
}
由于上下文绑定到闭包,我希望代码在每次调用匿名函数时更新数组的长度。然而,这并没有发生。如果我像这样多次调用闭包:
test()(1);
test()(2);
警报始终显示长度为 1。
你能解释一下为什么吗?
谢谢
【问题讨论】:
标签:
javascript
arrays
closures
【解决方案1】:
对test 的每次调用都会创建一个new 执行上下文,其中包含一个new 数组和一个关闭该上下文的new 函数(包括数组)。
如果你保存对函数test返回的引用,然后重复调用同一个函数,它将更新调用创建函数的test创建的数组,你会看到你所期望的:
var f = test();
f(); // 1
f(); // 2
当然,您可以拥有多个:
var first = test();
var second = test();
first(); // 1
first(); // 2
first(); // 3
second(); // 1
first(); // 4