下面是underscore源码对foreach的扩展: var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
//如果原生Array支持的话
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};有两个问题:
1.context参数起什么左右?
2.obj.length === +obj.length是什么意思?JavaScript
if (obj == null) return;
//如果原生Array支持的话
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};有两个问题:
1.context参数起什么左右?
2.obj.length === +obj.length是什么意思?JavaScript
iterator=function(value,key,obj){
alert(this);
}
那这个this就是context.
这个是改变this用的,你在回调函数里面用this就知道了。
2.obj.length === +obj.length是什么意思?
加号(+)是用来做类型转换的,换成数字
console.log(obj.length === +obj.length)//true
如果你一定要考虑这个的话,那这个函数得重写了,我只能说他的这个foreach方法不够严谨。
从代码看应该是判断obj是不是一个数组 但实际感觉这里判断条件不足另外
我个人觉得 目前 for 和 for in 的迭代足够使用了
自己封装一个迭代 没省什么代码 可读和调试还麻烦