这是一个简单的 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 这样做,真的不会出错。我忽略的任何问题都需要一个答案。