3

次の JavaScript コードを実行するとどうなりますか。

        var foo = {
           bar: function () {
               alert('s');
           }
       }

      //1. foo.bar();
      //2. var a = foo.bar;
      //3. var b = (foo.bar);          
       (foo.bar)();

「foo is undefined」というエラー メッセージが表示されますが、1. または 2. または 3. 行のコメントを外すと、アラート 's'? が表示されます。Reference 型と GetValue() に関することは知っていますが、ポイントがよくわかりません。

ありがとう

4

2 に答える 2

6

の前にセミコロンがないからです(foo.bar)

これにより、(...)関数呼び出し演算子として解釈されるため、前の式を関数であるかのように呼び出そうとします。

  var foo = {
       bar: function () {
           alert('s');
       }
   }(foo.bar) // <-- It sees it like this

前のものを で終了すると;、機能します。

   var foo = {
       bar: function () {
           alert('s');
       }
   }; // <--- right here

  //1. foo.bar();
  //2. var a = foo.bar;
  //3. var b = (foo.bar);          
   (foo.bar)();

したがって、他の行のコメントが解除されたときに機能した理由は、それらが終了したためです。

セミコロンを除外したい場合(私はそうしています)、次のルールに従えば安全です:

  • 前にa(がない限り、新しい行を a で始めないでください;
  • 前にa[がない限り、新しい行を a で始めないでください;

これらの文字のいずれかで行を開始するときはいつでも、その前に a を付けて; 前のステートメントが終了したことがわかるようにします。

于 2012-11-06T16:21:20.597 に答える
3

;の定義の後にが必要ですfoo

コードは として解析されvar foo = { ... }(foo.bar)ます。

これは、オブジェクトを定義し、それを関数として呼び出し (その時点までに取得していれば別のエラーが発生していたはずです)、その関数の戻り値を別の関数として呼び出すと解釈されます。

あなたが得るエラーは、fooその定義内に存在しないということです。

于 2012-11-06T16:21:16.257 に答える