896

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

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

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

4

4 に答える 4

1346

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

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

そこがない+と、パーサーがステートメント(式または複数の非式ステートメントの場合があります)を期待している状態にある場合、単語は関数ではなく関数宣言functionの始まりのように見えるため、次のようになります。 (上記の行の終わりにあるもの)は構文エラーになります(その例では、名前がない場合と同様)。を使用すると、関数式になります。これは、名前がオプションであり、呼び出し可能な関数への参照になるため、括弧が有効であることを意味します。()+

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

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
于 2012-11-12T10:07:25.483 に答える
99

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

var num = +variant;

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

blah + (+(function(){ var scope; return "4"; })());
于 2012-11-12T10:54:10.957 に答える
64

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

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

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

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

于 2012-11-16T16:45:29.140 に答える