從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)()