3

Crockford の著書 Javascript: The Good Parts から JavaScript を学んでいます。彼はそこでクロージャを使用して情報をカプセル化する方法を説明しています。例えば

var myObject = (function () {
    var value = 0;
    return {
        getValue: function () {
            return value;
        }
    };
}());

これを正しく理解していれば、オブジェクト リテラルを返す関数を定義するという考えになります。この関数は、myObject を初期化するために呼び出されます。しかし、一番外側の括弧のポイントは何ですか?[(f...);]。() のペアは、定義した関数を呼び出すのに十分ではありませんか?

4

1 に答える 1

6

あなたは正しいです; 最も外側の括弧は何もしませんが、とにかく括弧を付けるのが一般的です -- 可読性に役立ちます。このように括弧で囲まれた関数を見ると、すぐに呼び出されることを期待しますが、括弧がなければ、最初はそれほど明白ではないかもしれません。ここでは視覚的な合図にすぎません。

ただし、関数を関数宣言ではなく関数式にするために、関数を括弧で囲む必要がある場合があることに注意してください。

たとえば、次の場合は機能しません

function() {
    // Do something...
}();
// Throws a syntax error.

この場合、構文エラーが発生します。これは、パーサーが関数宣言を想定しているのに、この関数に名前を付けていないためです。さらに、関数宣言をすぐに呼び出すことはできません。これを関数式に変換するには括弧が必要です:

(function() {
    // Do something...
})();

var関数宣言と関数式の違いは、関数宣言は、変数の宣言に使用できるのと同じ方法で関数の宣言に使用できることです。

// Declare the variable foo.
var foo;

// Declare the function bar.
function bar() {
    // Do something...
}

ただし、関数式は変数を宣言しません。むしろ、変数に割り当てたり、呼び出したりするなど、何かに使用できる関数を作成するだけです。

関数式を作成するには、 以外の何かで行を開始する必要がありますfunction。上記のように、一般的な手法は、括弧で開始することです。あなたが述べたように、次の行を開始することもできますvar something = ...

var foo = function() {
    return 5;
}();
// foo is now 5

ただし、有効な式を作成するものから実際に開始できます。

!function() {
    console.log(1);
}();
// logs 1

~function() {
    console.log(2);
}();
// logs 2

+function() {
    console.log(3);
}();
// logs 3

[ function() {
    console.log(4);
}() ];
// logs 4

'Hello, World' == function() {
    console.log(5);
}();
// logs 5

もちろん、関数の結果を変数に格納しようとしている場合は、これらのパターンを使用することはできません。それらはすべて戻り値を台無しにするからです。ほとんどの人は、一貫性と読みやすさのために、必要かどうかに関係なく、関数を括弧で囲むことに固執します。

于 2012-11-20T05:37:43.460 に答える