bind是什么
bind()方法創建一個新的函數, 當被調用時,將其this關鍵字設置為提供的值,在調用新函數時,在任何提供之前提供一個給定的參數序列。
var result = fun.bind(thisArg[, arg1[, arg2[, ...]]]) result(newArg1, newArg2...)
沒看懂沒事接著往下看。
bind到底做了什么
從上面的介紹中可以看出三點。首先調用bind方法會返回一個新的函數(這個新的函數的函數體應該和fun是一樣的)。同時bind中傳遞兩個參數,第一個是this指向,即傳入了什么this就等于什么。如下代碼所示:
this.value = 2var foo = { value: 1}var bar = function() { console.log(this.value)}var result = bar.bind(foo)bar() // 2result() // 1,即this === foo第二個參數為一個序列,你可以傳遞任意數量的參數到其中。并且會預置到新函數參數之前。
this.value = 2var foo = { value: 1};var bar = function(name, age, school) { console.log(name) // 'An' console.log(age) // 22 console.log(school) // '家里蹲大學'}var result = bar.bind(foo, 'An') //預置了部分參數'An'result(22, '家里蹲大學') //這個參數會和預置的參數合并到一起放入bar中我們可以看出在最后調用 result(22, '家里蹲大學') 的時候,其內部已經包含了在調用bind的時候傳入的 'An'。
一句話總結:調用bind,就會返回一個新的函數。這個函數里面的this就指向bind的第一個參數,同時this后面的參數會提前傳給這個新的函數。調用該新的函數時,再傳遞的參數會放到預置的參數后一起傳遞進新函數。
自己實現一個bind
實現一個bind需要實現以下兩個功能
返回一個函數,綁定this,傳遞預置參數
bind返回的函數可以作為構造函數使用。故作為構造函數時應使得this失效,但是傳入的參數依然有效
1、返回一個函數,綁定this,傳遞預置參數
this.value = 2var foo = { value: 1};var bar = function(name, age, school) { console.log(name) // 'An' console.log(age) // 22 console.log(school) // '家里蹲大學' console.log(this.value) // 1}Function.prototype.bind = function(newThis) { var aArgs = Array.prototype.slice.call(arguments, 1) //拿到除了newThis之外的預置參數序列 var that = this return function() { return that.apply(newThis, aArgs.concat(Array.prototype.slice.call(arguments))) //綁定this同時將調用時傳遞的序列和預置序列進行合并 }}var result = bar.bind(foo, 'An')result(22, '家里蹲大學')這里面有一個細節就是Array.prototype.slice.call(arguments, 1) 這句話,我們知道arguments這個變量可以拿到函數調用時傳遞的參數,但不是一個數組,但是其具有一個length屬性。為什么如此調用就可以將其變為純數組了呢。那么我們就需要回到V8的源碼來進行分析。#這個版本的源碼為早期版本,內容相對少一些。
新聞熱點
疑難解答
圖片精選