111

最近、現在のバージョンのjson2.jsと自分のプロジェクトのバージョンを比較していたところ、関数式の作成方法と自己実行方法に違いがあることに気付きました。

無名関数を括弧で囲んで実行するコードは、

(function () {
  // code here
})();

ただし、自動実行された関数を括弧で囲みます。

(function () {
  // code here
}());

Explain JavaScript のカプセル化された匿名関数構文の受け入れられた回答に、CMS によるコメントがあります。 「両方とも(function(){})();有効(function(){}());です。」</p>

何が違うの?と思いました。前者は、グローバルな無名関数を残すことでメモリを占有しますか? 括弧はどこに配置する必要がありますか?

4

4 に答える 4

66

They're virtually the same.

The first wraps parentheses around a function to make it a valid expression and invokes it. The result of the expression is undefined.

The second executes the function and the parentheses around the automatic invocation make it a valid expression. It also evaluates to undefined.

I don't think there's a "right" way of doing it, since the result of the expression is the same.

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
于 2010-08-02T01:49:17.893 に答える
13

In that case it doesn't matter. You are invoking an expression that resolves to a function in the first definition, and defining and immediately invoking a function in the second example. They're similar because the function expression in the first example is just the function definition.

There are other more obviously useful cases for invoking expressions that resolve to functions:

(foo || bar)()
于 2010-08-02T01:49:36.893 に答える
10

構文以外の違いはありません。

それを行う2番目の方法に関する懸念について:

検討:

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

namedfunc名前を指定しても、グローバル スコープには含まれません。同じことが無名関数にも当てはまります。そのスコープでそれを取得する唯一の方法は、括弧内の変数に割り当てることです。

((namedfunc = function namedfunc () { ... })())

外側の括弧は不要です:

(namedfunc = function namedfunc () { ... })()

しかし、とにかくそのグローバル宣言は必要ありませんでしたね?

つまり、要約すると次のようになります。

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

そして、それをさらに減らすことができます:名前は決して使用されないため不要です(関数が再帰的でない限り..そしてそれでも使用できますarguments.callee)

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

それが私の考え方です (ECMAScript の仕様をまだ読んでいないため、間違っている可能性があります)。それが役に立てば幸い。

于 2010-08-02T02:35:58.937 に答える