现在的位置: 首页 > 综合 > 正文

javascript 的forEach函数

2013年06月16日 ⁄ 综合 ⁄ 共 3248字 ⁄ 字号 评论关闭

在Base2中找到一个叫forEach的函数,是我见过的最好的实现。挖出来分析一下。它能对各种普通对象,字符串,数组以及类数组进行遍历。如果原游览器的对象已实现此函数,它则调用原对象的函数。

    function forEach(object, block, context, fn) {
      if (object == null) return;
      if (!fn) {
        if (typeof object == "function" && object.call) {
          //遍历普通对象
          fn = Function;
        } else if (typeof object.forEach == "function" && object.forEach != arguments.callee) {
          //如果目标已经实现了forEach方法,则使用它自己的forEach方法(如标准游览器的Array对象)
          object.forEach(block, context);
          return;
        } else if (typeof object.length == "number") {
          // 如果是类数组对象或IE的数组对象
          _Array_forEach(object, block, context);
          return;
        }
      }
      _Function_forEach(fn || Object, object, block, context);
    };

    function _Array_forEach(array, block, context) {
      if (array == null) return;
      var i = 0,length = array.length;
      if (typeof array == "string") {
        for (; i < length; i++) {
          block.call(context, array.charAt(i), i, array);
        }
      }else{
        for (;i < length; i++) {
          block.call(context, array[i], i, array);
        }
      }
    };

    function _Function_forEach(fn, object, block, context) {//惰性函数
      // 此为隋性函数,第一次重写自身
      _Function_forEach = function(fn, object, block, context) {
        // 这里的fn恒为Function
        for (var key in object) {
           //只遍历本地属性
           if (object.hasOwnProperty(key)) {
            //相当于  block(object[key], key)
            block.call(context, object[key], key, object);
          }
        }
      };
      _Function_forEach(fn, object, block, context);
    };

原作者的一些例子(我翻墙扒过来了!):

  function print(el,index){
    alert(index+"  :  "+el)
  }
  forEach ([1, 2, 3], print);
  forEach ({a: "aa", b: "bb",c: "cc"}, print);
  forEach ("司徒正美", print);
  forEach(document.styleSheets,function(el){
    if(el.href) alert(el.href)
  });

抱歉!评论已关闭.