自己实现call方法
2019-07-31 本文已影响0人
yanmingfei
call
方法的目的是为了改变this
指向问题。
function fn1(){
console.log(1)
}
function fn2(){
console.log(2)
}
fn1.call(fn2) //1
如何实现呢?
首先我们可以考虑一个问题,this
指向在对象中是如何表明的呢?很简单
var name = '小王'
var obj = {
name:'小李',
say(){
console.log(this.name);
}
}
obj.say();//小李
var fn = obj.say
fn();小王
上面之所以会打印小李
或者小王
,在于函数执行前面有没有对象,如果没有对象,则指向window
;那也就说明了,我们可以通过调用函数时,改变this
指向通过它的调用者的对象来改变。那么call
方法我们也可以借助于这一点来实现。
通过代码来实现call方法
Function.prototype.call = function(context){
if(typeof this !== 'function'){
throw new Error('这不是一个函数')
}
//这一步的目的是为了如果context是字符串,则把它变成 包装对象来使用。如果context没传参数则用window。
context = context?Object(context):window;
context.fn = this; //把this当前函数变为context的一个方法。
var args = [...arguments].slice(1);
let res = context.fn(args); //再让方法执行,那么context.fn中的this指向已经指向了context
delete context.fn;
return res;
}