在Javascript闭包中更新上下文数组

时间:2014-01-07 08:47:56

标签: javascript arrays closures

我有这段简单的代码:

function test(){
   var test_array = []
   return function(i){
     test_array.push(i);
     alert(test_array.length);
   };
 }

由于上下文绑定到闭包,我希望每次调用匿名函数时代码都会更新数组的长度。然而,这并没有发生。如果我像这样多次调用闭包:

test()(1);
test()(2);

警报始终显示长度为1。 你能解释一下为什么吗? 谢谢

1 个答案:

答案 0 :(得分:4)

每次调用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