Here's an exampleループ変数が別のスコープにないため、単純なJSループが期待どおりに動作しない状況が発生します。Javascript関数スコープForループ
しばしば提示ソリューションは、次のようになりますループコードの不快に見えるビットを構築することである。
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-loopと同じようなパフォーマンスを持つはずです(同じ方法で使用するので)。
更新:Object.prototype
でやっていることは、かなり壊れていますので、かなり大きなものです。すべて。ここで
は控えめ実装です:
function each (obj,f) {
for (var i in obj) {
f(i,obj[i]);
}
}
非常にわずか
each(obj,
function(i,v) {
... v ...
}
);
への呼び出しの変更は、だから私はjQueryのは、それをこのようにしている場合、私は自分の質問に答えてきたと思います、することができます本当に間違っています。私が見落とした問題は答えが必要です。
「Object.each()」シムの実装方法についてJSライブラリをチェックしてください。パフォーマンスと最適化については、[JSPerf](http://jsperf.com)を使用してコードをテストし、[CodeReview](http://codereview.stackexchange.com/)でお問い合わせください。 – Joseph
はい私は見ました'jQuery.each()'は今すぐ実装されているので、引数の順序を単純に逆転させ、実際には何もチェックしません。 –