3

重複の可能性:
JavaScript オブジェクト/関数/クラス宣言を囲む括弧は何を意味しますか?

次のように使用する場合、JS の丸括弧の意味は何ですか:

<script>
(
 function foo(){ alert("Hello world!")}()
)
</script>

期待どおりに動作し、「Hello world!」と表示されます。でもブラケットを外すと

 <script>

 function foo(){ alert("Hello world!")}()

</script>

Chrome コンソールで「Uncaught SyntaxError: Unexpected token )」というエラーが生成されます。なぜこのようなことが起こるのかわかりません...何か助けはありますか?

4

2 に答える 2

4
(
 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>>

于 2012-06-03T11:19:15.980 に答える
0

これは自己実行関数ですが、ここで別の質問があります。javascriptの自己実行関数の目的は何ですか?

于 2012-06-03T11:15:42.057 に答える