fangbinwei/zepto_src_analysis

$.each v.s. $.fn.each

fangbinwei opened this issue · 0 comments

$.each

  // callback(index, item)反人类 迭代类数组或者对象
  $.each = function(elements, callback){
    var i, key
    if (likeArray(elements)) {
      for (i = 0; i < elements.length; i++)
      // 注意 使用了call, 遍历dom的时候会很有用
        if (callback.call(elements[i], i, elements[i]) === false) return elements
    } else {
      for (key in elements)
        if (callback.call(elements[key], key, elements[key]) === false) return elements
    }

$.each方法既可以对类数组使用, 也可以对一般的对象使用, callback返回false, 迭代提前结束


$.fn.each

    each: function(callback){
      emptyArray.every.call(this, function(el, idx){
        // callback(index, item)反人类
        return callback.call(el, idx, el) !== false
      })
      return this
    }

$.each使用Array.prototype.every方法来实现,主要是用来对Zepto对象使用, callback如果return false,则迭代提前结束, 注意判断用的是!== 全不等, 只有false!==false 返回 false.

Zepto本质上是new了一个Zepto对象, 把DOM对象按index放进这个Zepto对象.这个Zepto对象的__proto__指向Z.prototype/zepto.Z.prototype -> $.fn. $.fn的很多方法都是通过$.fn.each(this.each)来进行遍历的.