JavaScriptの閉鎖は、積極的な開発と受動的開発の特徴です。つまり、一方で、JSはいくつかの問題をよりよく解決するために閉鎖を持っています。一方、特定の問題を解決するために、JSは閉鎖を使用して問題をかろうじて解決する必要があります。
前者はここでは議論されていません。 JSクロージャーが問題をより適切に解決できる場合、もちろん、クロージャーの使用方が優れています。
私が議論しているのは、JS自体の制限と、「変数の要件が1回のみ初期化される」などの閉鎖で解決する必要がある問題のために後者です。
従来の言語はこれを解決します:
コードコピーは次のとおりです。
クラスクラス{
function init(){
this.n = 0;
}
function func(){
this.n ++;
this.n;
}
}
var obj = new class();
JavaScriptは通常、この方法で解決されます(閉鎖を使用):
コードコピーは次のとおりです。
var obj = {
func :( function(){
var n = 0;
return function(){
n ++;
n;
}
})()
}
しかし、私はこの方法をお勧めします(閉鎖を排除します):
コードコピーは次のとおりです。
function class(){
var self = this;
self.n = 0;
self.func = function(){
self.n ++;
self.nを返します。
}
}
var obj = new class();
後者はよりスケーラブルであるためです。変数に異なる操作を実装する必要がある場合、後者は異なる関数(つまり、単純な線形拡張)を定義するだけで、前者(閉鎖)を完全に書き直す必要があります(これが、単語のリファクタリングをよく聞く理由です)。