vue的原始碼分析(2)
function polyfillBind (fn, ctx) { function boundFn (a) { var l = arguments.length; return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx) } boundFn._length = fn.length; return boundFn }
獲取boundFn中的arguments的長度
if(l){ if(l>1){ fn.apply(ctx, arguments) }else{ fn.call(ctx, a) } }else{ fn.call(ctx) }
如果引數不存在,直接繫結作用域呼叫該函式fn.call(ctx)
如果存在且只有一個,那麼呼叫fn.call(ctx, a), a是入參
如果存在且不止一個,那麼呼叫fn.apply(ctx, arguments)
call與apply的區別,call接受引數是一個一個接收,apply是作為陣列來接收。如:
fn.call(this, 1,2,3) fn.apply(this, [1,2,3])
對於不支援它的環境,使用簡單的繫結polyfill,
例如,Phantomjs 1.x。從技術上講,我們不再需要這個了。
因為在大多數瀏覽器中,本機繫結的效能已經足夠了。
但是刪除它意味著破壞能夠執行的程式碼
PhantomJS 1.x,所以為了向後相容,必須保留它。
function nativeBind (fn, ctx) { return fn.bind(ctx) } var bind = Function.prototype.bind ? nativeBind : polyfillBind;
原生的bind。以及判定這個bind是原生的還是polyfill
function toArray (list, start) { start = start || 0; var i = list.length - start; var ret = new Array(i); while (i--) { ret[i] = list[i + start]; } return ret }
資料轉換。感覺就是遍歷迴圈一個個儲存到一個新的ret上。
function extend (to, _from) { for (var key in _from) { to[key] = _from[key]; } return to }
檢查有多少個屬性,然後賦值返回到to上
function toObject (arr) { var res = {}; for (var i = 0; i < arr.length; i++) { if (arr[i]) { extend(res, arr[i]); } } return res }
定義了一個res物件
function noop (a, b, c) {}
一個空函式?。。。不知道幹啥。往下再看看
var no = function (a, b, c) { return false; };
一個no??綁定了一個函式返回false?再看看
var identity = function (_) { return _; };
一個傳什麼返回自己的東西?
function genStaticKeys (modules) { return modules.reduce(function (keys, m) { return keys.concat(m.staticKeys || []) }, []).join(',') }
從編譯器模組生成包含靜態鍵的字串
function looseEqual (a, b) { if (a === b) { return true } //如果:引數a和引數b恆等於返回true; //isObject這個函式已經看到過了,不為空且恆等於object var isObjectA = isObject(a); var isObjectB = isObject(b); if (isObjectA && isObjectB) { //判定a和b是否滿足 try { var isArrayA = Array.isArray(a); var isArrayB = Array.isArray(b); //a和b是否為一個數組 if (isArrayA && isArrayB) { //如果如果滿足,檢測a是否滿足條件 //補充every()函式 e是當前元素值,索引 //array.every(function(currentValue,index,arr), thisValue) return a.length === b.length && a.every(function (e, i) { return looseEqual(e, b[i]) }) } else if (a instanceof Date && b instanceof Date) { return a.getTime() === b.getTime() } else if (!isArrayA && !isArrayB) { var keysA = Object.keys(a); var keysB = Object.keys(b); return keysA.length === keysB.length && keysA.every(function (key) { return looseEqual(a[key], b[key]) }) } else { /* istanbul ignore next */ return false } } catch (e) { /* istanbul ignore next */ return false } } else if (!isObjectA && !isObjectB) { return String(a) === String(b) } else { return false } }
這一段有點長,我看下注釋打在程式碼裡.作用判斷兩個值是否相等。結構是否相同