web-dev-qa-db-ja.com

匿名JavaScript関数を自動実行するための括弧の場所は?

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

匿名関数を括弧で囲んで実行するために使用されるコード、

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

しかし今では、自動実行された関数を括弧で囲んでいます。

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

JavaScriptのカプセル化された匿名関数構文の説明 その「両方:(function(){})();および(function(){}());は有効です。」

私は違いが何であるかと思っていましたか?前者は、グローバルな匿名関数を残してメモリを消費しますか?括弧はどこにあるべきですか?

105
Kevin Hakanson

それらはほぼ同じです。

最初の関数は、関数を括弧で囲んで有効な式にし、呼び出します。式の結果は未定義です。

2番目は関数を実行し、自動呼び出しを囲む括弧はそれを有効な式にします。また、未定義と評価されます。

式の結果は同じであるため、それを行う「正しい」方法はないと思います。

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
64
meder omuraliev

その場合は問題ではありません。最初の定義では関数に解決される式を呼び出し、2番目の例では関数を定義してすぐに呼び出しています。最初の例の関数式は単なる関数定義であるため、これらは似ています。

関数に解決される式を呼び出すための、他の明らかに便利なケースがあります。

(foo || bar)()
13
Triptych