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


867

私はすぐに呼び出される関数に関する情報を探していましたが、どこかでこの表記に出くわしました。

+function(){console.log("Something.")}()

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



回答:


1321

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

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

なし+パーサが、それは、ワード(式またはいくつかの非式文することができます)声明期待しています状態にある場合があり、function関数の始まりのようなルックスの宣言ではなく、関数表現そうとし()て、次の(上記の行の最後にあるもの)は構文エラーになります(その例では、名前が存在しない場合と同様です)。+、それはそれは名前がオプションであると意味し、その関数式になり呼び出すことができる機能、を参照した結果、括弧が有効であるようにします。

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

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


159
かっこで囲むことは優れた表記であると言えませんか?かっこで表現を囲んでいるのはよく知っています。+このjsの不可解な癖をまだ知らない場合、このケースで+が何をしているのかはまったく明らかではありません。
クリス

1
注:2つの括弧オプションのうち、jsLintは2番目のオプションを優先します。jsHintはそれほど扱いにくいと思います。
ビートルートビートルート2013

43
「プラス」表記を使用する一般的に使用されるライブラリの1つは、Bootstrapです(これが私がこのスレッドを読んだ方法です)。
Ville

ブートストラップはこれを行っています、ところで:maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel

95

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

var num = +variant;

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

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

3
これで37票が得られたのはなぜですか。(+function() { ... })()表記法は(これは質問に答えていないという事実から離れて)エラーなしで実行することはできません。
whitequark

6
@whitequark:function + callの前後に1組の中括弧がありませんでした。数字のキャストの説明が原因で、賛成票が多かったのではないかと考えています。
Phil H

10
OK私はつまらないものだったのかもしれません。
ホワイトクォーク、

2
@クリストフ私はそれらの括弧をそこに残す傾向があります。実際、足りない場合は追加するまで行ってしまいます。これにより、何が起こっているのかがより明確になり、スペースが削除されてコードが最小化され3++function...、同じではない場合の問題も防止されます。
Benjam 2013年

3
それ以上の考察で+function...は、それ自体は不要です。同じ結果が得blah + function( ){ ... }( );られ、ラッピングブラケットが不要になります。
ベンジャム2013年

61

つまり、関数の結果を何らかの方法で使用することで、構文エラーを防ぐことができます。

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

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

もちろん、全体を中括弧で囲むこともその目的に役立ちます。


45
ボイドまたは括弧は非常に好ましいです。WTFフリーです。+の使用は、あまり賢くない種類の賢さです。
Peter Wone 2015年

2
良い点。いずれかの演算子を使用すると、現在の業界標準に反するように見えます。おそらく「クールな子供」の開発者はそれを選ぶでしょう。そうでなければ、私はvoidや()ではなく何かを使用する意味がまだありません
dudewad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.