昨天搜了下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 =
複製**
但這麼寫有個問題,我們希望在sum裡面對this進行操作的時候,作為this源的物件也跟著改動,所以我們那麼寫:function
that = json.parse(json.stringify(that)) //給做個深拷貝,不影響原來的物件
that.fn = this
return that.fn(...arg) //用屬性呼叫的方式執行函式,讓this指向傳入的that,放入引數
}複製**
複製**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和傳進來的引數,以便在返回函式中用到它們:
和前面一樣,將mybind放到function的原型上,並測試它:function
mybind(that, ...arg)
}複製**
參考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有...