筆記 bind的簡單應用和模擬實現

2021-09-24 08:42:53 字數 1590 閱讀 1765

複製**

如果大家覺得有用的話,可以往下溜達溜達~

複製**

bind不帶引數的時候

我們可以發現,函式newshow在執行時候,具體的功能實際上還是函式show的功能,不過此時的this指向為window

bind帶乙個引數的時候

我們可以發現,函式newshow在執行時候,具體的功能實際上還是函式show的功能,不過此時的this指向為obj

bind帶多個引數的時候

我們可以發現,函式show在呼叫bind方法時,傳遞了引數obj,"a","b", 返回了新的函式newshow。

函式newshow在執行時候,具體的功能實際上還是函式show的功能,只不過this的指向變成了obj。

重點: 函式newshow在執行的時候,傳遞的引數 "c" "d"會拼接到 "a" "b" 後面,一併在內部傳遞給函式show執行

容易忽略:new操作

通過**返回結果我們可以發現,雖然函式newshow是函式show通過bind方法產生的乙個新的函式,但是進行new操作時newshow的constructor還是函式show,並且this指向也不是obj

通過上對懟bind的簡單應用,我們可以發現:

基本骨架搭建,傳遞乙個引數

期望:可以返回乙個函式,並且新函式的this指向改變

根據上文的bind總結我們可以知道,bind最簡單的作用就是改變函式this的指向,並且返回乙個新的函式。

沒有傳引數時候,this指向window

期望:在呼叫模擬實現的newbind方法時不傳引數,this指向為window

要實現這個功能也很簡單,當函式呼叫沒有傳遞引數target的時候,我們可以做乙個判斷,讓this指向window。

傳遞多個引數的時候

期望:在呼叫模擬實現的newbind方法時傳的引數,可以和呼叫newbind方法後返回的函式在執行時候傳的引數拼接在一起,並且傳遞給真正執行的函式

先看**:

複製**

結果:函式newshow在執行的時候,傳遞的引數 會拼接到1,2後面,一併在內部傳遞給self執行

new操作的時候

期望:在進行new 操作的時候,我們希望newshow的this指向不被改變,把並且newshow的constructor為函式show

下面貼**:

this instanceof temp ? this : target || window, args.concat(_arg)

複製**

**的行為: 判斷是否進行了new操作,如果進行的是new 操作,則在原型鏈上能找到this的原型,返回this,否則修改thia指向為target或window。

bind的模擬實現

var context context window var result 判斷是否有第二個引數 if arguments 1 else delete context.fn return result var foo function bar name,age bind 方法會建立乙個新的函式。當這...

bind函式 模擬實現JS的bind方法

先看一下bind是什麼?var obj obj typeof function.prototype.bind functiontypeof function.prototype.bind functionfunction.prototype.bind.name bindfunction.protot...

apply call與bind函式的模擬實現

this是函式呼叫時產生的物件,該物件繫結函式呼叫時所在執行環境。call bind方法在使用乙個指定的 this 值和若干個指定的引數值的前提下呼叫某個函式或方法。function obj window,args function mycall obj window,args bind 方法會建立...