手寫乙個bind函式(大概)

2021-09-24 08:17:29 字數 1611 閱讀 7473

昨天搜了下bind怎麼實現,大家都在說bind的特徵啊啥的,沒搜到,今天有人問起來,我反問他要咋搜,他和我說柯里化。柯里化!!!它的最常用的表現形式不就是傳說中的閉包的其中一種嘛!!!

i think! i can do it!!!我覺得我可以嘗試著實現一下。

首先我們來回想this指向的幾種可能性:

當函式作為乙個物件的屬性被呼叫時,『.』 前面是誰this就指向誰。如:obj.run()、obj.a.run(),run函式裡的this就分別指向obj和a。

建構函式裡的this指向它的例項。如:function a(); let b = new a(),這時a中的this就指向b。

以上都不是,this指向window,嚴格模式指向undefind。

想想我們可以使用可能性1,先來寫個aplly方法:

先寫個實驗用具:

function

sum(a, b)

let obj1 =

let obj2 =

複製**

function

that = json.parse(json.stringify(that)) //給做個深拷貝,不影響原來的物件

that.fn = this

return that.fn(...arg) //用屬性呼叫的方式執行函式,讓this指向傳入的that,放入引數

}複製**

但這麼寫有個問題,我們希望在sum裡面對this進行操作的時候,作為this源的物件也跟著改動,所以我們那麼寫:

function

that = that!== null && typeof that === 'object'?that: {} //在this不為object時的處理

that.fn = this

const result = that.fn(...arg)

delete that.fn //使用完之後對that下的fn進行刪除

return result

}複製**

複製**

柯里化(curry):只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數。

接下來我們要用到柯里化形式的閉包來儲存下bing函式呼叫時的this和傳進來的引數,以便在返回函式中用到它們:

function

mybind(that, ...arg)

}複製**

和前面一樣,將mybind放到function的原型上,並測試它:

function.prototype.mybind = mybind

const sum3 = sum1.mybind(obj1)

console.log(sum3()) //18

const sum4 = sum1.mybind(obj1).mybind(obj2)

console.log(sum4()) //18

const sum5 = sum2.mybind(obj1, 5)

console.log(sum5(6)) //11

複製**

參考

js 手寫 bind 函式

首先,bind 函式是乙個函式函式呼叫bind 這裡簡稱fn 之後,返回給你乙個新的函式,在bind 裡面不是直接執行你傳入的這個 fn,而是在bind 返回給你的函式裡面執行這個函式,有點繞,給大家用 說下 function.prototype.bind function functiona le...

手寫 call apply 及 bind 函式

function.prototype.mycall function context context context window context.fn this 建立fn屬性,並將值設定為需要呼叫的函式 const args arguments slice 1 因為call可以傳入多個引數作為呼叫...

bind函式 手寫bind this指向問題

要手寫bind,首先要很熟悉bind的工作邏輯和原理 先寫個例子來看一下bind的使用 利用bind改變fn的this指向 執行結果 bind函式會返回乙個新函式,需要fn1來接收一下,bind把函式的this繫結到了newobj物件上 所以寫bind得先看一下內部是怎麼操作的 邏輯 1 bind有...