web-dev-qa-db-ja.com

Javascript匿名関数呼び出し

私は、匿名関数を呼び出す奇妙な方法に出くわしたときに、JSの知識ベースを改善するために、TwitterからJSソースを読んでいました。

!function( $ ) {
    ...
}( window.jQuery );

...そしてこれは動作します! :)

これは誰にとっても明らかです:

function ( $ ) { ... } ( window.jQuery )

動作しません(構文エラー)、これは正しいですが:

(function ( $ ) { .... })( window.jQuery )

誰でもこの魔法を説明してもらえますか(!function作品)?

50

キーワードfunctionがステートメント位置で(ステートメントの最初のトークンとして)一致する場合、関数宣言はfunctionステートメントとして表されます。関数ステートメントはスコープの最上部に引き上げられ、すぐに呼び出すことはできず、名前が必要です。

キーワードが式の位置で一致する場合(つまり、文の最初のトークンとしてではなく、!が最初のトークンである場合)、関数宣言はとして表現されますfunction expression。匿名の場合があり、新しく作成された関数の値を返します。新しく作成された関数の値を返すので、その後に括弧を追加してすぐに呼び出すことができます。

括弧内の宣言のラッピングは同じことを行いますが、!または+を接頭辞として付けるよりも一般的です。

(function () {
    ...
}());
71
Felix Loether

2番目の形式function () {}statementです。 !演算子は、これをに変換します。 functionキーワードの前に-または+を使用する場合もあります。

関数を評価する式がある場合、()演算子を使用してその関数を呼び出すことができます。

同じ効果を保存する別の(おそらく理解しやすい)方法は、別の括弧を使用することです。

( function(x) { body; } )(arg);

関数を括弧内に配置することにより、関数を式に再度変換し、式に評価します。この関数は、argを引数として呼び出されます。

8
nimrodm

感嘆符に関する限り、それは魔法ではありません。結果をtrue/falseに変換します。

あなたの問題は、匿名関数にエラーがあることです。

0
Shane

これは、javascript構文のバグのように聞こえます。

名前付き関数はステートメントである可能性がありますが、匿名関数はそれを式と見なします。

プロ:function() { ... }()を実行できます

欠点:function() { ... }はできません

しかし、なぜ匿名の関数を呼び出さずに定義したいのでしょうか?だから、詐欺は本当に心配ではありません。

0
Stone Zhong