手寫 call、apply、bind

從this的隱式綁定入手
我們都知道函數中this的指向只取決於該函數的調用位置,且其有四種綁定形式。即

  • 默認綁定
  • 隱式綁定
  • 顯示綁定
  • new綁定

而顯示綁定是借用了一些方法。如call、apply,bind。但是它們的怎麼實現的呢?
答:它們均是基於隱式綁定基礎之上的

先來看什麼是隱式綁定,看下面代碼:

function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); 

全局情況下的默認綁定之所以綁到了全局,是因爲函數調用位置在全局的上下文中,而這裏的調用位置拿到的上下文是obj的。

call,apply的實現均是基於隱式綁定,知曉了思路實現便非常簡單了
實現:

Function.prototype.myCall = function(context = window) {
    context.fn = this;
    let res = context.fn(...([...arguments].slice(1)));
    delete context.fn;
    return res;

}
Function.prototype.myApply = function(context = window, arr) {
    context.fn = this;
    let res;
    if (!arr) {
        res = context.fn();
    } else {
        res = context.fn(...arr);
    }


    delete context.fn;
    return res;

}
console.log(...[1, 2, 3]);

Function.prototype.myBind = function(contextcontext = window) {
    let that = this;
    let args = [...arguments].slice(1);
    return function() {
        return that.apply(context, args);
    }
}

function a(b, c) {
    console.log(this.d,b,c);

}
let e = {
    d: 1
}
a.myApply(e,[2,3])
a.myCall(e,2,3)
a.myBind(e,2,3)()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章