2

重複の可能性:
JavaScript: var functionName = function() {} vs function functionName() {}

私は、一部の領域から呼び出すことができるが他の領域から呼び出すことができないこの1つの関数を除いて、ほとんどが機能するJavascriptをいくつか持っています。スコープの問題のようですが、理由はわかりません。

$().ready(function () {
   UpdateElfDisplay(); // <--- Undefined

   $('#Attribute1').change(function () {
      UpdateElfDisplay();  // <--- Works just fine.
   });

   var UpdateElfDisplay = function () {
      // ... some work done here 
   };
 });

上でマークしたように、UpdateElfDisplay 関数は .change() 関数から呼び出すと正常に動作しますが、ドキュメントが読み込まれているときに呼び出そうとすると「未定義」になります。誰かが理由を説明できますか、またはこれを説明しているリソースに私を案内してください。

4

2 に答える 2

5

関数が定義される前に関数を呼び出しているため、機能しません。ハンドラー内のものは後で呼び出されるため、機能します

関数宣言を使用すると、「ホイスト」されて機能します。

function UpdateElfDisplay () {
  // ... some work done here 
}

JavaScript インタープリターは、式が評価される前に、関数の宣言形式を評価します。


サイドノート

これがReferenceErrorではなくTypeErrorである理由は、が実際には関数宣言と同様に巻き上げられているためですが、代入自体は巻き上げられていません。var UpdateElfDisplay

これは、変数は存在するが、まだ値が割り当てられていないことを意味します。


補足2

ハンドラーはおそらく次のように書き直すことができます。

$('#Attribute1').change(UpdateElfDisplay);
于 2012-10-04T17:53:20.523 に答える
4
var UpdateElfDisplay = function () {

この行までは、UpdateElfDisplay初期化されていません。

于 2012-10-04T17:53:25.803 に答える