0

私はまだこれらの Immediate Invoked Function Expression と少し混乱しています。スコープ クロージャを取得しました (Crockford の本を読んだことがあります) が、@plalx は、IIFEを使用して私が持っていた別の疑問 (最後にリンクされた jsfiddle) について、この例を親切に書いてくれました。そして、それはまた少し混乱しました、ここで私はどのように考えていますか.

Java では、次のように考えるでしょう。

type doSome(type input){
do_stuff
return same type
};

じゃあ後で

doSome(data);

jsでも同じことができますよね?

function doSome(input){
do_stuff;
return someThing;
}

そして後者:

doSome(data);

またはIIFEを使用すると、より多く使用されます:

var doSome = (function(data){
do_stuff;
return something
})();

そして後者:

doSome(data);

私はこれまでのところ正しいですか?

だから私の質問は: この場合、他の方法ではなくIIFEを使用するのはなぜですか? この疑問を提起した両方のコードは jsfiddle にあります。

http://jsfiddle.net/Victornpb/PT6Xc/7/

http://jsfiddle.net/PT6Xc/8/

4

2 に答える 2

2

これら 2 つの例の主な違いは、関数の本体が評価される頻度です。

この例: http://jsfiddle.net/Victornpb/PT6Xc/7/では、IIFE を使用すると、内部のコードは 1 回だけ評価され、関数が返されます。経由で関数を実行すると

document.body.innerHTML = deaccentuate(s);

返された関数の本体のみを実行し、その前にあるステートメントは実行しません。

他の例: http://jsfiddle.net/PT6Xc/8/

関数を実行するたびに、関数の本体全体が評価されdeaccentuate(s)ます。

document.body.innerHTML = deaccentuate(s);

したがって、実行時に一度だけ実行したい重い操作がある場合、または@RobGがプライベートメンバーに対して言ったように、この場合はIIFEを使用してください。

console.log("whatever")確認する両方の例の先頭に追加することで、これを確認できます。

http://jsfiddle.net/PT6Xc/9/ -> /7/ に対応

http://jsfiddle.net/PT6Xc/10/ -> /8/ に対応

于 2013-10-17T00:44:43.047 に答える