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

言い換えれば、最初のものは期待どおりに機能するのに、2 番目のものは機能しないのはなぜでしょうか? 最初のもの(関数自体に名前を付けて関数内から使用する)と2番目のもの(関数を参照する変数を使用する)の実際の違いは何ですか?

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 に答える