1

来自 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

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

4

3 回答 3

2

当函数具有名称(声明)时,它是在解析时定义的。它在范围内成​​为全球性的。

否则在运行时定义。

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

于 2013-03-31T11:43:11.993 回答
1

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

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

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

于 2013-03-31T11:44:27.640 回答
0

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

在这个例子中,函数何时被声明并不重要,因为当你的脚本被解析时,它首先会检查所有的函数声明。

IE

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

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

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

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

于 2013-03-31T14:58:38.997 回答