(
function foo(){ alert("Hello world!");}
)
上記の行では、関数オブジェクトとして解釈される関数fooを定義しています。
(
function foo(){ alert("Hello world!");}
)();
現在、関数を呼び出しています(function-objectを使用)。
注:パランセシスの使用方法は実際には間違っています。上記はそれらを使用する正しい方法です。
更新:
これは実際には良い質問です。私はしばらくそれをいじって、次の結論に達しました。(注、私はかなり間違っている可能性があります。その場合は教えてください。)
JSエンジンがコードを解析する方法についてです。解析するときはfunction foo(){ alert("Hello world!");}
、関数宣言と見なします。これは(おそらく)関数を呼び出すステートメントではありません(言語の文法に従っている可能性があります)。
ただし、次のコードは機能します
<script type=text/javascript>
[function foo(){ alert("Hello world!");}()]
</script>
そしてこれも:
<script type=text/javascript>
1,function foo(){ alert("Hello world!");}()
</script>
(そして明らかに上記の質問のもの)
これは、JSパーサーが内部の式、(..)
つまり最初に。を検出したときに式を予期しているためだと思い(
ます。これはcomma-operator
、上記の2番目のコードのように、および配列を初期化するときに(最初のコードで)発生します。ただし、コード(関数)を式のように見せるためのトークンがない場合、解析では最後のが検出されたときにエラーがスローされます()
。
更新2(これについてはFelix Klingに感謝します):
CMSの応答の文法のセクションに関する詳細な説明を参照してください。その答えは、私が上で話していたこと、つまりJS解析が関数宣言と関数式をどのように区別するかを非常に明確に説明しています。
(
function foo(){ alert("Hello world!")}()
)
関数式です。したがって、エラーなしで実行されます。
しかし、
function foo(){ alert("Hello world!")}<<STOP>>()
コンテンツtill<<STOP>>
は、関数式としてではなく、関数宣言として解析されます。したがって、エラーのフラグを立てた(
後、最初に遭遇したとき。<<STOP>>