4

Possible Duplicate:
What do parentheses surrounding a JavaScript object/function/class declaration mean?

Recently discussing with a colleague which is best

(function(){...}())

or

(function(){...})()

I got to wondering what ( ... ) actually does at a fundamental level, and what is the difference between what the js engine does in both the above cases. Is one approach theoretically (even if only a tiny amount) faster than the other? If my function returns an object what does ( .. ) do to the object in the first example?

Can anyone explain.

*edit The closest I've got to an explanation on the internet is http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#question-about-surrounding-parentheses, but this stops short, in my view, of explaining why the first example above works at all.

4

2 に答える 2

3

括弧もまったく必要ありません。これらの括弧の全体的な考え方は、関数を強制的にexpression宣言ではなく宣言にすることです。次のように達成することもできます

!function() {
}();

+その感嘆符は、または-その他の文字である可能性もあります。したがって、「犬のボール」バージョン (後者のもの) を使用しているかどうかに違いはありません。パフォーマンスの観点からは、保証はできませんが、99.9% の差はないと確信しています (せいぜいエンジン依存の変動かもしれません)。

したがって、これら 2 つの間にパフォーマンスの違いがないと仮定すると、どちらを使用するかはかなり個人的な好みになります。The Crockは何度も 2 番目のバージョンを「ドッグ ボール」と宣言しました。私はそれに同意します。前述のように、パターンは関数式を強制するだけであり、読みやすくするために全体をカプセル化する必要があります。

于 2012-02-03T15:08:37.533 に答える
2

最初の例は、2 番目の例とまったく同じ理由で機能します。本当の違いはありません。これも機能します:

!function() { ... } ();

これもそうです:

var _dont_care_ = function() { ... } ();

function重要なのは、キーワードが関数宣言ステートメントの開始ではないことをパーサーが認識するポイントでステートメントに現れるように調整することです。このような場合、functionキーワードは関数オブジェクトを式の値としてインスタンス化する必要があります。

式ステートメント以外の JavaScript のステートメントは、キーワードで始まります (ラベルは今のところ脇に置いておいてください)。キーワードで始まらないすべてのステートメント内function(ここでは手足に出ます) では、function関数オブジェクト値のインスタンス化だけが意味します。

于 2012-02-03T15:08:49.570 に答える