11

重複の可能性:
(function(){})();の違い およびfunction(){}();

JavaScriptの機能のいくつかをもう少しよく理解しようとしています。そのThe Definitive JavaScript中で、自己実行関数は次のように角かっこで囲む必要があると述べています。

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
})();

しかし、JavaScript - The Good Partsこの例が引用されている場合、次のように、角かっこなしで上記の自己実行関数があります。

var obj = function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
}();

これらの例はどちらも私には有効ですが、注意すべき機能に違いがあるかどうかを尋ねたいと思いました。これがささいなことではないことを願っています。確認したかっただけです。

どうもありがとう。

編集:

ロブWが指摘したように、この主題に関する別のスレッドがあります。これは、他の投稿からリンクされたこの問題に関する優れたブログです。

4

3 に答える 3

13

この場合、違いはありませんが、次のプレフィックスが付いているためです

var obj = ...

それがなければ、最初のバージョンのみが正しいです。インタープリターが関数宣言としてではなくfunction関数として正しく解析できるようにするために、追加の括弧が必要だからです。

var objもちろん、関数を実行するだけの場合 (つまり、その副作用が必要な場合) にのみ省略しますが、値を返さないか、戻り値が何であるかを気にしません。

于 2012-06-18T14:53:29.733 に答える
3

JavaScript: The Good Parts は Doug Crockford によって書かれ、彼は自分の例を次のように更新しました。

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    };
}());

したがって、式全体が括弧内にあります。

必須ではない外側の括弧の考え方は、これが意図的に自己実行される関数であることを開発者に明確にすることです。したがって、値は読みやすさです。

于 2012-06-18T14:56:58.550 に答える
1

この例では、機能上の違いはありませんが、括弧のおかげで読みやすくなっていると思います。括弧なしでどのようにスコープされているかをどうやって知るのですか? 吊り上げられていますか?これは、このテーマに関する素晴らしいスレッドです。

余談:

JSLint は、「関数ステートメントは呼び出し可能ではありません。関数呼び出し全体を括弧で囲んでください」と文句を言うでしょう。厳密モードで実行されていないほとんどのブラウザー パーサーは、一般的にそれを通過させると思いますが、それに依存しない方がよいでしょう。

于 2012-06-18T14:51:59.517 に答える