これは、JavaScriptで機能する方法です。これはクロージャと呼ばれます。関数は、現在のスコープおよび他の親スコープから変数ポインターを運びます。したがって、これは良い習慣であるだけでなく、パラメータオブジェクトなどをプッシュするのではなく、通常従う必要のあるパターンです。
「this」参照は特別であり、(他の参照とは対照的に)閉じられることはなく、したがって常に無名関数でグローバルオブジェクトを指すことに注意してください。
実際、開発者はクロージャー機能の力を完全に活用するためにある程度の時間を必要とします-これはあなたが今書いた基本的な例です。より高度な(非同期だけでなく)シナリオでは、クロージャーは「ファイアアンドフォーゲット」動作を作成するのに役立ちます。または、クライアントコードからアクセスできない「プライベート」変数を提供できます(ライブラリ開発に役立ちます)。クロージャは、グローバルスコープを混乱させないようにコードを分離するのにも役立ちます。
1)例:クロージャを使用して保護された変数を作成する方法。「protectedVariable」にアクセスできる2つのメソッドにアクセスできますが、自分でアクセスすることはできません。そのため、制御が保証されます。
function protectedScope(initData) {
var protectedVariable = initData;
return {
getter: function() { return protectedVariable; }
setter: function(v) { protectedVariable = v; }
}
}
var methods = protectedScope(10);
console.log(methods.getter());
2)分離:次のコードは、「グローバル」関数定義を使用してもグローバルスコープをガベージしません
var API = (function() {
var protectedVariable = 0;
var myNotGlobalFunction() {
return protectedVariable;
}
return myNotGlobalFunction;
})();