下面是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

解决方案 »

  1.   

    1.就是将iterator方法劫持给context,等于context也有了iterator方法,如果iterator方法里有this,就是指向context,就是常说的上下文。2.+obj.length是将字符串转成数字等同于0+obj.length,foreach也可能是一个有length属性的对象,比如{a:1,b:1,length:'2'},这时候obj.length是'2',不是2,一个是字符串一个是数字,所以obj.length === +obj.length为false,则执行最后的else里面的代码,否则为正常数组的话obj.length为2,+obj.length也是2,obj.length === +obj.length为true,则数组遍历。
      

  2.   

    哦,写漏了,当obj.length是'2'的时候 ,obj.length为2,+obj.length是'02'。
      

  3.   

    iterator.call(context, obj[i], i, obj);如果
    iterator=function(value,key,obj){
        alert(this);
    }
    那这个this就是context.
      

  4.   

    1.context参数起什么左右?
        这个是改变this用的,你在回调函数里面用this就知道了。
    2.obj.length === +obj.length是什么意思?
        加号(+)是用来做类型转换的,换成数字
      

  5.   

      var obj = {a:1,length:2}
      console.log(obj.length === +obj.length)//true
      

  6.   


    如果你一定要考虑这个的话,那这个函数得重写了,我只能说他的这个foreach方法不够严谨。
      

  7.   

    } else if (obj.length === +obj.length) {
    从代码看应该是判断obj是不是一个数组 但实际感觉这里判断条件不足另外
    我个人觉得 目前 for 和 for in 的迭代足够使用了
    自己封装一个迭代 没省什么代码 可读和调试还麻烦
      

  8.   

    发现自己个错误,+obj.length跟0+obj.length不是一回事。。
      

  9.   

    javascript 1.8.5封装啦原生的filter、map等操作,underscore.js扩展啦这些方法