4

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

Twitter Bootstrap JavaScript コードを調べていたところ、すべてのプラグインが自己呼び出し関数の否定にラップされていることに気付きました。

function ($) { ... }(window.jQuery);関数をすぐに呼び出すことは承知しています。

しかし、何の!ためですか?

4

1 に答える 1

6

1)あなただけの場合:

function () { /* ... */ }();

エラーが発生します。
JS では、関数宣言を開始することはできません (技術的には正しくないが、多くの人にとって考えるのがはるかに簡単な「変数巻き上げ」の概念のため)。
宣言関数を使用する場合:

function myFunc () { /* ... */ }

JS エンジンは、変数がすべて上にあり、関数がすべて下にある場合でも、スコープの変数を作成する前に、現在のスコープでそれらを作成します。

だからあなたが書くとき:

function myFunc () { /* ... */ }();

現在のスコープではまだ存在していない変数が内部で呼び出される可能性があるため、エラーが発生します。これはクラッシュが保証されています。

さらに、関数宣言に名前を付けない場合は、次のようになります。

function () { /* ... */ }

...その後、まだ関数を呼び出すことができないため、そこにエラーがありますが、名前がなく、変数に割り当てていないため、取得する方法がありません.

()or+などの演算子!-- エンジンに次に来るものを評価させるものは何でも、次のような関数を起動できます。

+function () { /* ... */ }();

return ステートメントをリッスンする変数がない限り、問題ありません。

2) また、 の場合、!function () { /*...*/ }();その関数が当然 return 文を持っていなければ、 を返しundefinedます。
の反対はundefinedtrueそのように強制されたときです...

...だから、あなたが本当に、本当にしたいのなら、次のようなことができます:

var success = !function () { /* ... */ }();
if (success) { doStuff(); }
于 2012-11-28T03:54:46.327 に答える