【问题标题】:Difference between named function expression, and using a variable reference?命名函数表达式和使用变量引用之间的区别?
【发布时间】:2013-03-21 16:09:10
【问题描述】:

来自 javascript.info:

function makeArmy() {

  var shooters = []

  for(var i=0; i<10; i++) {

    var shooter = function shoot() {
      alert( shoot.i )
    }
    shooter.i = i

    shooters.push(shooter)   
  }

  return shooters
}

var army = makeArmy()

army[0]() // 0
army[1]() // 1

有趣的部分:

var shooter = function shoot() {
  alert( shoot.i )
}
shooter.i = i

我的问题是:为什么以下方法不起作用:

var shooter = function() {
  alert( shooter.i )
}
shooter.i = i

换句话说,为什么第一个按预期工作,而第二个没有?第一个(给函数本身命名并在函数内使用它)和第二个(使用引用函数的变量)之间的实际区别是什么?

【问题讨论】:

    标签: javascript function closures scopes


    【解决方案1】:

    当函数具有名称(声明)时,它是在解析时定义的。它在范围内变得全局。

    否则在运行时定义。

    http://markdaggett.com/blog/2013/02/15/functions-explained/

    【讨论】:

      【解决方案2】:

      在其初始化表达式 (function() {...}) 完成之前,您不能引用 变量 shooter。如果你说

      var shooter;
      shooter = function() { alert(shooter.i); }
      

      它可以正常工作,因为变量已经被声明并且在函数表达式被计算的点的范围内。

      【讨论】:

        【解决方案3】:

        只是补充史蒂夫所说的话。在提到函数声明时,您会听到“提升”一词。

        在此示例中,函数声明的时间并不一定重要,因为当您的脚本被解析时,它首先会检查所有函数声明。

        alert(fnDeclaration());
        function fnDeclaration() {
            return "It works!";
        }
        

        在你做函数表达式的情况下,你只能在函数被赋值后才能使用它,因为函数是 JavaScript 中的值。

        i.e.
        alert(fnDeclaration());
        var fnDeclaration = function() {
            return "It won't work :(";
        }
        

        这是两者之间差异的一般要点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-29
          • 2014-09-20
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多