質問
コーディング時:
var a =
function()
{
alert("44")
return function(){alert(33)}
}()();
この式は次の順序で評価されますか?
- 関数を定義する
- 参照ポインタをaに渡します
- a()が呼び出されます
- 新しい関数ポインタで返す
- a()が再び呼び出されます
そしてもしそうなら、なぜ私は構文エラーを持っています:
function()
{
alert("44")
return function(){alert(33)}
}();
インタープリターは最初に左オペランドを必要とします...
しかし、この構文は機能します:
(
function()
{
alert("44")
return function(){alert(33)}
};
)()
外括弧の意味??????
ありがとう
解決
これは言語の構文です。匿名関数をインプレース実行する場合は、括弧で囲む必要があります。
JSには、構文が予想よりも奇妙なこれらのエッジケースがあります。たとえば、JSONを含む文字列を評価することは、括弧で囲まない限り機能しません。
// Wrong
eval("{ ... }");
// Right
eval("({ ... })");
それは言語の構文です。
とはいえ、私が思うに(これは厳密には私見です)、あなたが概説した手順は正確ではありません。
- 関数が定義され、呼び出されます。 alert(" 44");結果として起こります。
- この関数は、呼び出される別の関数を返します。 alert(" 33");
- 最も内側の関数は何も返さないため、aは事実上未定義です。 typeof aは「未定義」を返します。
他のヒント
-
function(){alert(" 44")return function(){alert(33)}}
関数を定義 -
function(){alert(" 44")return function(){alert(33)}}
()
匿名関数を返す関数を呼び出すfunction(){alert(33)}
-
function(){alert(" 44")return function(){alert(33)}}()
()
返された関数を呼び出すので、実際には次と同等ですfunction(){alert(33)}()
したがって、実行全体は次と同等です:
alert("44"); alert(33);
私は自己呼び出し機能を学習しているだけです。
そして、私はコードが
3. (function(){alert(" 44"); return function(){alert(33);}})()()
所属していません StackOverflow