5

私はこの非常にクールなスニペットを見ていました.jsでこの奇妙な行に出くわし、関数が呼び出されないように削除しています

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

、関数を()でラップすると、意図したとおりに機能します。

(function(d, w){
    ...
})(document, window);

だから私の質問は、その奇妙な行は何ですか?なぜそれが機能するのですか? 私の野生のゲストは、それがある種のIIFEであるということです...

4

2 に答える 2

11

そうです、これは即時呼び出し関数式 (IIFE) です。

あなたは書き直すことができます

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

!function() {
    ...
}()

そしてそれはまだ動作します。これは、!が単項演算子であるためです ( +-、および~-- https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operatorsを参照)。単項演算子の後には、式が期待されます (そして評価されます!)。式は関数呼び出しにすることができます。

でも

!function() {
    ...
}()

は単なる別の式であるため、その前に別の単項演算子を置くことができます。

+!function() {
    ...
}()

必要に応じて、このパターンを続けることができます。

注:この方法で無名関数を呼び出すと、関数の戻り値が無視されます。したがって、戻り値に関心がない場合にのみ、これを使用してください。

編集: Daff が回答で言及したhttp://benalman.com/news/2010/11/immediately-invoked-function-expression/への優れた参照を追加しました。

于 2013-04-23T13:20:29.073 に答える
4

トリックは、実際にはそこにある単一の!演算子です (最初の行全体が実際には同じことを行います)。これも同様に機能します。

!function(d, w){
   ...
}(document, window);

いつものように、すぐに呼び出される関数式に関する Ben Alman の素晴らしい記事をお勧めします。

于 2013-04-23T13:18:37.767 に答える