32

重複の可能性:
感嘆符は関数の前に何をしますか?

KnockoutJS 2.1.0のソースコードを見ると、7行目から次のようなコード構造が見られます。

!function(factory) { ... }(factoryDefinition);

not演算子を使用すると、この式はtrueではなくに評価されundefinedますが、なぜわざわざするのでしょうか。

4

2 に答える 2

55

これは、すぐに実行される関数式を作成するための簡潔な方法です。

伝統的に、人々はこれらの2つの形式を使用していました

(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use

ただ使用しようとすると

function(){ }(); // Syntax error

式ではなく関数宣言として解釈されるため、構文エラーになります。これが、関数を括弧で囲む必要がある理由です。

ただし、関数宣言の前に単項演算子を配置すると、かっこを追加する必要がなくなり、コードの1文字が切り取られます。これは、(非常に)小さなパフォーマンス上の利点です。これと同じ目的で使用できる単項演算子がいくつかあります

!function(){ }();
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 
于 2012-08-11T15:37:20.483 に答える
3

もしなければ、構文エラーのように見えるからです。

function(factory) { ... }(factoryDefinition);

それを試してみてください。

functionキーワードがそのコンテキストで認識されるように、パーサーを式を期待するポイントに到達させる必要があります。それ以外の場合、パーサーがfunctionステートメントの最初のトークンと見なすと、単純な関数宣言が必要になり、その後に括弧で囲まれた引数リストを続けることはできません。

さまざまな選択肢があり、それぞれの周りにさまざまな意見が集まっています。

于 2012-08-11T15:36:00.057 に答える