これは、ループ変数が別のスコープにないために、単純なJSループが期待どおりに動作しない状況の例です。
よく提示される解決策は、次のような不快に見えるループコードを作成することです。
for (var i in obj) {
(function() {
... obj[i] ...
// this new shadowed i here is now no longer getting changed by for loop
})(i);
}
私の質問は、これを改善できるかということです。これを使用できますか:
Object.prototype.each = function (f) {
for (var i in this) {
f(i,this[i]);
}
};
// leading to this somewhat more straightforward invocation
obj.each(
function(i,v) {
... v ...
// alternatively, v is identical to
... obj[i] ...
}
);
「スコープループ」が必要だと確認したときは?見た目はややすっきりしていて、通常のforループと同様のパフォーマンスが得られるはずです(同じように使用するため)。
更新:それはほとんどすべてObject.prototype
を壊すので、で物事を行うことは大きなノーノーのようです。
邪魔にならない実装は次のとおりです。
function each (obj,f) {
for (var i in obj) {
f(i,obj[i]);
}
}
呼び出しは非常にわずかに変化します
each(obj,
function(i,v) {
... v ...
}
);
だから私は自分の質問に答えたと思います、jQueryがこのようにそれをするなら、本当に間違って行くことはできません。私が見落とした問題は、答えが必要です。