JavaScript專題之模擬實現bind

2021-09-13 03:47:10 字數 2178 閱讀 3044

本文共 1100 字,讀完只需 4 分鐘
概述

首先觀察 bind 函式有什麼特點:

var person = 

function say(age, ***)

var foo = say.bind(person, '男', 39);

foo(); // jaychou 男 39

返回乙個函式

函式引數以逗號的形式傳入

改變了 this 的指向

一、call 簡單實現

既然 bind 內部也要用改變 this 指向,我們可以用現成的 call 函式來實現這一功能。

function.prototype.newbind = function(context) 

var self = this;

return function ()

}

說明一下:

if 判斷是為了校驗,只能讓函式來呼叫此方法,並丟擲錯誤。

第二個return是為了讓返回的函式有返回值的功能。

測試一下:

var person = ;

var say = function()

var foo = say.newbind(person);

foo(); // jaychou

成功啦。

二、傳遞引數

剛才的函式是沒有傳遞引數,當然不行,所以我們想辦法把函式的引數也傳遞進去。

bind 函式有個特點,就是在繫結的時候可以傳參,返回的函式還可以繼續傳參。

var person = ;

var say = function(p1, p2)

var foo = say.bind(person, 18);

foo(20); // jaychou 18 20

還可以寫成:

say.bind(person, 18)(20); // jaychou 18 20
function.prototype.newbind = function(context) 

var self = this;

var args = array.prototype.slice.call(arguments, 1); // 間接呼叫陣列方法,獲取第一次傳的引數

return function ()

}var person = ;

var say = function(p1, p2)

var foo = say.newbind(person, 18); // 第一次傳參

foo(20); // 第二次傳參

最後輸出:

jaychou 18 20
結果正確,以上就完成了 bind 函式基本功能的實現。

但是!三、作為建構函式時?

bind 函式其實還有乙個非常重要的特點:

bind返回的函式如果作為建構函式,搭配new關鍵字出現的話,我們的繫結this就需要「被忽略」。
意思就是指:當使用 nuw 關鍵字把 bind 返回的函式作為建構函式,之前改變了指向的 this 就失效了。返回的函式的 this 就關聯到了建構函式的例項物件上。

針對這個特點,需要再做一些修改:

function.prototype.newbind = function(context) 

var self = this;

var args = array.prototype.slice.call(arguments, 1); // 間接呼叫陣列方法,獲取第一次傳的引數

let tempfn = function {}; // 利用乙個空函式作為中轉

tempfn.prototype = this.prototype; // 修改返回函式的 prototype 為繫結函式的 prototype,例項就可以繼承繫結函式的原型中的值

var resultfn = function () else

}resultfn = new tempfn();

return resultfn;

}

總結

JavaScript專題之陣列去重

一 雙層迴圈 var array 1,1,1 1 function unique array console.log j 如果array i 是唯一的,那麼執行完迴圈,j等於reslen if j reslen return res console.log 雙層迴圈 unique array 1,1...

javascript之模擬滾動條

demo 如下 孩兒勵志出湘關,學不成名終不還。埋骨何須桑梓地,人生無處不青山。孩兒勵志出湘關,學不成名終不還。埋骨何須桑梓地,人生無處不青山。孩兒勵志出湘關,學不成名終不還。埋骨何須桑梓地,人生無處不青山。孩兒勵志出湘關,學不成名終不還。埋骨何須桑梓地,人生無處不青山。孩兒勵志出湘關,學不成名終不...

JavaScript之模擬事件(事件)

第一步 通過document.createevent 方法建立event物件。可以在document物件上使用createevent 方法建立event事件物件。該方法接收乙個引數,表示事件型別的字串。dom2中字串是以複數表示的,在dom3中字串是以單數表示。表示事件型別的字串有 dom2中表示事...