3

次の 2 つのブロックの違いは何ですか?

// block 1
{
    console.log("anonymous block");
}

// block 2
(function anon() {
    console.log("anonymous block 2");
})();

これをNetbeansで(node.jsプラグインを使用して)実行しましたが、どちらも機能しているようです...

4

3 に答える 3

6

違いは、後者の形式を使用して、グローバル変数を破棄せずに非表示にできることです。

たとえば、デフォルトでメインの名前空間をにエイリアスするjQueryライブラリを使用しているとします$$通常の使用方法を変更せずに別の目的で使用したい場合は$、次のようにすることができます。

(function($) {
    // Use $ without clashing with the jQuery object.
})(someObject);

実際、それは他の1つの目的にも役立ちます。undefinedはJavaScriptの予約語ではないため、値を指定して目的を失う可能性があります。したがって、undefinedパラメータに値を渡すことはできず、グローバル値と衝突することなく適切に動作することがわかります。

undefined = "some not-undefined value";    // you'd have to be an idiot to do this but I've seen it done
(function(a, b, undefined) {
    console.log(typeof(undefined) === "undefined");   // true
})(someA, someB);
于 2012-09-07T20:48:37.310 に答える
3

1つ目は、関数と同じではないブロックを作成します。匿名の自己実行関数を使用して、ローカルのプライベート変数を作成し、そこからインターフェイスを返すことができます。これはモジュールパターンと呼ばれます。

var Module = (function() {

    var method = function() { console.log("anonymous block"); },
        someOtherMethod = function() {};

    return { // return our interface as an object literal
        method: method,
        someOtherMethod: someOtherMethod
    };
})();

Module.method(); // "anonymous block"

変数methodを保持someOtherMethodし、グローバルスコープから分離して呼び出すことができます。これは、JSのオブジェクト指向プログラミングの最も重要で便利な機能の1つです。

于 2012-09-07T20:50:35.743 に答える
0

block 1内部にあるブロックのスコープがあり、変数を設定すると親で上書きされます。使用できますlet

var a = 2;
{
    var a = 4;
}
a; // === 4

block 2はグローバル スコープを持ちますが、var実行後に設定されたものはすべて忘れられます。

var a = 2;
(function(){
    var a = 4;
})();
a; // === 2
于 2012-09-07T20:51:27.470 に答える