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

在Javascript闭包中更新上下文数组,javascript,arrays,closures,Javascript,Arrays,Closures,我有一段简单的代码: function test(){ var test_array = [] return function(i){ test_array.push(i); alert(test_array.length); }; } 由于上下文绑定到闭包,我希望每次调用匿名函数时代码都会更新数组的长度。然而,这并没有发生。如果我多次这样调用闭包: test()(1); test()(2); 警报始终显示长度为1。 你能解释一下原因吗? 谢谢对tes

我有一段简单的代码:

function test(){
   var test_array = []
   return function(i){
     test_array.push(i);
     alert(test_array.length);
   };
 }
由于上下文绑定到闭包,我希望每次调用匿名函数时代码都会更新数组的长度。然而,这并没有发生。如果我多次这样调用闭包:

test()(1);
test()(2);
警报始终显示长度为1。 你能解释一下原因吗?

谢谢

test
的每次调用都会创建一个新的执行上下文,其中包含一个新数组和一个新函数,该函数结束于该上下文(包括数组)

如果保存对函数
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

test
的每次调用都会创建一个新的执行上下文,其中包含一个新数组和一个在该上下文(包括该数组)上关闭的新函数

如果保存对函数
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

详细的解决方案请访问“感谢您提供详细的答案”详细的解决方案请访问“感谢您提供详细的答案”