web-dev-qa-db-ja.com

関数名の前のJavaScriptプラス記号

私は自己起動関数についての情報を調べていました、そしてどこかで私はこの記法についてつまずきました:

+function(){}

関数の前にある+記号が何を意味するのか、または何を意味するのか、誰かが私に説明できますか?

813
jOpacic

パーサは+に続く部分を式として扱うように強制されます。これは通常すぐに呼び出される関数に使われます。例えば:

+function() { console.log("Foo!"); }();

そこに+がないと、パーサーがステートメント(式またはいくつかの式ではないステートメント)を期待している状態にある場合、Wordのfunctionは関数の始まりのように見えます 宣言 expression という関数とそれに続く()(上の行の最後にあるもの)は構文エラーになります(その例では名前が存在しないため)。+を指定すると、それは関数式になります。これは、名前がオプションであり、呼び出し可能な関数への参照になるため、括弧は有効です。

+はオプションの1つです。 -!~、またはその他の単項演算子にすることもできます。代わりに、括弧を使用することもできます(これはより一般的ですが、構文的にはそれほど正しいわけではありません)。

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
1278
T.J. Crowder

@ TJCrowderの回答の補助として、+は通常、値の数値キャストを強制するために使用されます このSO回答が説明するように この例では、これは「単項プラス演算子」と呼ばれています(グーグルを簡単にするため)。

var num = +variant;

そのため、関数の前では、関数の結果を数値として解釈するように強制することができます。まだそれは起こりませんが、理論的にはJITはそれを使ってその関数を数値のみの関数などとしてコンパイルすることができます。しかし、より大きい式で使われるときに単項プラスと連結を防ぐためには括弧が必要です。

blah + (+(function(){ var scope; return "4"; })());
86
Phil H

つまり、簡単な答えは、関数の結果を何らかの方法で使用することによって構文エラーを防ぐことです。

void演算子を使用して、戻り値に関心がないことをエンジンに指示することもできます。

void function() { console.log("Foo!"); }();

もちろん、全体をブレースで囲むこともその目的に役立ちます。

53
Ja͢ck