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