私は、匿名関数を呼び出す奇妙な方法に出くわしたときに、JSの知識ベースを改善するために、TwitterからJSソースを読んでいました。
!function( $ ) {
...
}( window.jQuery );
...そしてこれは動作します! :)
これは誰にとっても明らかです:
function ( $ ) { ... } ( window.jQuery )
動作しません(構文エラー)、これは正しいですが:
(function ( $ ) { .... })( window.jQuery )
誰でもこの魔法を説明してもらえますか(!function
作品)?
キーワードfunction
がステートメント位置で(ステートメントの最初のトークンとして)一致する場合、関数宣言はfunctionステートメントとして表されます。関数ステートメントはスコープの最上部に引き上げられ、すぐに呼び出すことはできず、名前が必要です。
キーワードが式の位置で一致する場合(つまり、文の最初のトークンとしてではなく、!
が最初のトークンである場合)、関数宣言はとして表現されますfunction expression。匿名の場合があり、新しく作成された関数の値を返します。新しく作成された関数の値を返すので、その後に括弧を追加してすぐに呼び出すことができます。
括弧内の宣言のラッピングは同じことを行いますが、!
または+
を接頭辞として付けるよりも一般的です。
(function () {
...
}());
2番目の形式function () {}
はstatementです。 !
演算子は、これを式に変換します。 function
キーワードの前に-
または+
を使用する場合もあります。
関数を評価する式がある場合、()
演算子を使用してその関数を呼び出すことができます。
同じ効果を保存する別の(おそらく理解しやすい)方法は、別の括弧を使用することです。
( function(x) { body; } )(arg);
関数を括弧内に配置することにより、関数を式に再度変換し、式に評価します。この関数は、arg
を引数として呼び出されます。
感嘆符に関する限り、それは魔法ではありません。結果をtrue/falseに変換します。
あなたの問題は、匿名関数にエラーがあることです。
これは、javascript構文のバグのように聞こえます。
名前付き関数はステートメントである可能性がありますが、匿名関数はそれを式と見なします。
プロ:function() { ... }()
を実行できます
欠点:function() { ... }
はできません
しかし、なぜ匿名の関数を呼び出さずに定義したいのでしょうか?だから、詐欺は本当に心配ではありません。