重複の可能性:
感嘆符は関数の前に何をしますか?
KnockoutJS 2.1.0のソースコードを見ると、7行目から次のようなコード構造が見られます。
!function(factory) { ... }(factoryDefinition);
not演算子を使用すると、この式はtrue
ではなくに評価されundefined
ますが、なぜわざわざするのでしょうか。
重複の可能性:
感嘆符は関数の前に何をしますか?
KnockoutJS 2.1.0のソースコードを見ると、7行目から次のようなコード構造が見られます。
!function(factory) { ... }(factoryDefinition);
not演算子を使用すると、この式はtrue
ではなくに評価されundefined
ますが、なぜわざわざするのでしょうか。
これは、すぐに実行される関数式を作成するための簡潔な方法です。
伝統的に、人々はこれらの2つの形式を使用していました
(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use
ただ使用しようとすると
function(){ }(); // Syntax error
式ではなく関数宣言として解釈されるため、構文エラーになります。これが、関数を括弧で囲む必要がある理由です。
ただし、関数宣言の前に単項演算子を配置すると、かっこを追加する必要がなくなり、コードの1文字が切り取られます。これは、(非常に)小さなパフォーマンス上の利点です。これと同じ目的で使用できる単項演算子がいくつかあります
!function(){ }();
~function(){ }();
-function(){ }();
+function(){ }();
何もしなければ、構文エラーのように見えるからです。
function(factory) { ... }(factoryDefinition);
それを試してみてください。
function
キーワードがそのコンテキストで認識されるように、パーサーを式を期待するポイントに到達させる必要があります。それ以外の場合、パーサーがfunction
ステートメントの最初のトークンと見なすと、単純な関数宣言が必要になり、その後に括弧で囲まれた引数リストを続けることはできません。
さまざまな選択肢があり、それぞれの周りにさまざまな意見が集まっています。