理解经典执行上下文示例

时间:2015-07-21 08:25:05

标签: javascript

所以我正在阅读关于javascript中执行上下文的blog。之后,我尝试了解典型的闭包/ EC示例:

http://jsfiddle.net/s3kpmz33/

function foo() {
    var foos = [];
       for(var i = 0; i < 3; i++) {
          foos.push(function() {
             alert(i);
           });
       }
    return foos;
}

var foos = foo();

foos[0]();
foos[1]();
foos[2]();

//All alert 3 

我认为,如果我理解正确,i因为闭包而为3。在函数执行时,它们将在foo范围内的当前范围之外查找变量i,并且当它们被执行时它们发现它是3。

然后我以这种方式修复它:

http://jsfiddle.net/s3kpmz33/2/

function foo() {
    var foos = [];
       for(var i = 0; i < 3; i++) {
           (function bar(k) {
               foos.push(function _bar() {
                  alert(k);
               })
           })(i);
       }
    return foos;
}

var foos = foo();

foos[0]();
foos[1]();
foos[2]();

//Correctly alert 0, 1, 2

现在,我认为这背后的原因是因为每个_bar函数现在都查看bar函数范围,并且因为这是一个生命,或任何将使用该值执行的函数我想要(以前声明的函数,例如@Quentin指出),它们都创建了i值的OWN本地副本,并将其分配给局部变量k

我的假设是否正确?我意识到我可能没有非常清楚地解释它,因为我觉得我不太了解它。如果我在推理中犯了错误,请纠正我。

如果你能用更简单的词语改进我的推理,那么我和那些来这里寻找答案的同事们也会非常感激。

1 个答案:

答案 0 :(得分:3)

  

因为这是一个生命

它不需要是IIFE。您可以改为调用先前声明的函数。

function alerter_factory(value_to_alert) {
  return function() {
    alert(value_to_alert);
  }
}

function foo() {
  var foos = [];
  for (var i = 0; i < 3; i++) {
    foos.push(alerter_factory(i));
  }
  return foos;
}

var foos = foo();

foos[0]();
foos[1]();
foos[2]();

  

他们都创建了自己的OWN本地副本,并将其分配给局部变量k。

关闭。

他们拥有自己的的本地副本,i已分配给本地k变量。