zepto源碼解讀(二)——zpeto.init()——(3)isFunction函數

zepto.init中在判斷函數這塊有一個方法叫作isFunction()。字面上來看顯而易見是判斷是否爲函數,深刻底層來看一下它是如何來實現的數組

首先看一下它在init()函數中是如何被調用的:函數

else if (isFunction(selector)) return $(document).ready(selector)

而後看看zepto中isFunction()的位置:在全局中定義的方法。spa

function isFunction(value) { return type(value) == "function" }

顯然,type(value)函數能夠返回value的值。那咱們再去看type函數:code

  //type用於返回對象類型,class2type[]中存在對應屬性
  function type(obj) {
    return obj == null ? String(obj) :
      class2type[toString.call(obj)] || "object"
  }

若是對象是null,則返回"null「,若是存在對象,則用toString.call(對象)調用,而且在class2type這個對象數組中找到對應的值,沒有的話返回object對象

先將一下這個toString方法,能夠返回對象的類型,例以下面的例子會依次返回[object Array];[object Number];[object Boolean];blog

document.write(toString.call([1,2]))
document.write(toString.call(1))
document.write(toString.call(true))

瞭解了tostring以後,咱們來看看class2type是個什麼對象。首先它是被在zepto函數頂部聲明瞭的,是一個對象接口

    class2type = {},

按照以前的思路class2type應該是一個對象數組,看了下面這段代碼你就明白了:zepto

$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase()
  })

用$.each()方法,將內置對象添加到class2type中,並給class2type定義了不少個屬性,屬性值就是對應的name小寫名稱,即name.toLowerCase()是一個js內置方法string

很顯然,到這裏這個isFunction()方法就一目瞭然了。總結一下:it

傳入須要檢測的參數---遞傳入type()函數判斷---type函數利用了class2type的對象數組使其轉換成對應的對象名稱---返回。

講到這裏在順便提一下,zepto還有一個方法叫$.isFunction()和$.type(),用於判斷對象的類型,其實跟這裏咱們講的isFunction()函數是同樣的,只是zepto中加了一行:

  $.type = type
  $.isFunction = isFunction
  $.isWindow = isWindow
  $.isArray = isArray
  $.isPlainObject = isPlainObject

明白了吧,將內部的函數方法經過   $.函數名=函數名   這種方法暴露出去,而$就是這個接口。

相關文章
相關標籤/搜索