次の 2 つのブロックの違いは何ですか?
// block 1
{
console.log("anonymous block");
}
// block 2
(function anon() {
console.log("anonymous block 2");
})();
これをNetbeansで(node.jsプラグインを使用して)実行しましたが、どちらも機能しているようです...
次の 2 つのブロックの違いは何ですか?
// block 1
{
console.log("anonymous block");
}
// block 2
(function anon() {
console.log("anonymous block 2");
})();
これをNetbeansで(node.jsプラグインを使用して)実行しましたが、どちらも機能しているようです...
違いは、後者の形式を使用して、グローバル変数を破棄せずに非表示にできることです。
たとえば、デフォルトでメインの名前空間をにエイリアスする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);
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つです。
block 1
内部にあるブロックのスコープがあり、変数を設定すると親で上書きされます。使用できますlet
。
var a = 2;
{
var a = 4;
}
a; // === 4
block 2
はグローバル スコープを持ちますが、var
実行後に設定されたものはすべて忘れられます。
var a = 2;
(function(){
var a = 4;
})();
a; // === 2