質問

コーディング時:

var a =
function()
{
    alert("44")
    return function(){alert(33)}
}()();

この式は次の順序で評価されますか?

  1. 関数を定義する
  2. 参照ポインタをaに渡します
  3. a()が呼び出されます
  4. 新しい関数ポインタで返す
  5. a()が再び呼び出されます

そしてもしそうなら、なぜ私は構文エラーを持っています:

function()
{
    alert("44")
    return function(){alert(33)}
}();

インタープリターは最初に左オペランドを必要とします...

しかし、この構文は機能します:

(
  function()
  {
    alert("44")
    return function(){alert(33)}
  };

)()

外括弧の意味??????

ありがとう

役に立ちましたか?

解決

これは言語の構文です。匿名関数をインプレース実行する場合は、括弧で囲む必要があります。

JSには、構文が予想よりも奇妙なこれらのエッジケースがあります。たとえば、JSONを含む文字列を評価することは、括弧で囲まない限り機能しません。

// Wrong
eval("{ ... }");
// Right
eval("({ ... })");

それは言語の構文です。

とはいえ、私が思うに(これは厳密には私見です)、あなたが概説した手順は正確ではありません。

  1. 関数が定義され、呼び出されます。 alert(" 44");結果として起こります。
  2. この関数は、呼び出される別の関数を返します。 alert(" 33");
  3. 最も内側の関数は何も返さないため、aは事実上未定義です。 typeof aは「未定義」を返します。

他のヒント

  1. function(){alert(" 44")return function(){alert(33)}} 関数を定義
  2. function(){alert(" 44")return function(){alert(33)}} () 匿名関数を返す関数を呼び出す function(){alert(33)}
  3. function(){alert(" 44")return function(){alert(33)}}() () 返された関数を呼び出すので、実際には次と同等です function(){alert(33)}()

したがって、実行全体は次と同等です:

alert("44"); alert(33);

私は自己呼び出し機能を学習しているだけです。
そして、私はコードが 3. (function(){alert(" 44"); return function(){alert(33);}})()()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top