遍历数组或对象里所有成员的函数。
来源是underescore中的源码,给改成普通函数了function each(obj, iterator, context) {
      if (obj == null) {
return;
}
      else if (obj.length === +obj.length) {
        for (var i = 0, l = obj.length; i < l; i++) {
          if (iterator.call(context, obj[i], i, obj) === {}) return;
        }
      } 
      else {
        for (var key in obj) {
          if (iterator.call(context, obj[key], key, obj) === {}) return;
        }
     }
};var data1 = [4,5,6,7];
var data2 = {
 "a": 4,
 "b": 5,
 "c": 6
}; 
each(data1,function say(i)
{
    alert(i)
}) //依次alert 4 5 6 7
问题1:obj.length === +obj.length 的含义是判断这个obj参数到底是数组还是对象吧?
问题2:第三个参数context的含义,例子中没有第三个参数照样能输出结果
问题3:iterator.call(context, obj[i], i, obj)和iterator.call(context, obj[key], key, obj)
改为iterator.call(context, obj[i])和iterator.call(context, obj[key])不行吗? 貌似去掉没啥影响吧

解决方案 »

  1.   

    1: 判断length是不是number
    2: iterator的执行环境,缺省在window执行
    3: 就say()来说没影响,别的iterator或许需要i/key和obj引用做进一步处理,具体意图author才知道。
      

  2.   

    ++
    因为这个函数只支持对数组和对象的each1:判断obj是否数组的一种变异方法,你改成else if (obj[0])也可以,
    3:允许迭代器iterator接收三个参数,以最大化满足它处理事务时的需求:
      1:是数组时:元素的值,索引,原数组
      2:是对象时:键值,键名,原对象 
    var data2 = {
     "a": 4,
     "b": 5,
     "c": 6
    };
    each(data2,function say(value,name,o){
      alert(name+"="+value);
    });