一、this指向
apply/call/bind的作用都是改变this指向。在不使用这三个函数的情况下,this总是指向函数的直接调用对象。
let obj={
a:1,
fun:function(){
console.log(this.a);
}
}
let ofun=obj.fun;
obj.fun();//1,this指向函数的调用对象obj
ofun();//undefined,ofun在全局作用域中调用,this指向window
二、模拟实现函数的call方法
(1)分析:函数call的第一个参数是this,后面的参数是以逗号分隔的调用call函数的函数对象的以逗号分隔参数列表。
(2)代码实现
Function.prototype.mycall=function(context){
context=context||window;
content.fun=this;
let args=[];
for(let i=1;i<arguments.length;i++){
args.push(arguments[i]);
}
let result=context.fn(args.join(","));
delete context.fun;
return result;
}
三、模拟实现函数的apply方法
(1)分析:apply函数有两个参数,第一个参数是this,第二个参数是调用apply函数的函数对象的参数组成的数组。
(2)代码实现
Function.prototype.myapply=function(context,args){
context=context||windows;
context.fun=this;
let result;
if(!args){
result=context.fun();
}else{
let arr=[];
for(let i=0;i<args.length;i++){
arr.push(args[i]);
}
result=context.fn(args.join(","));
}
delete context.fun;
return result;
}
四、模拟实现函数的bind方法
(1)分析:bind函数的参数与call函数一致,但是其不立即执行,返回一个函数。
(2)代码实现:
Function.protptype.mybind=function(context){
let self=this;
return function(){
return self.call(context,arguments);
}
}
代码参考:https://www.nowcoder.com/discuss/513379