call,apply的主要功能:
- 改变调用他们的函数体内部this的指向:指向第一个参数(为null指向宿主对象:浏览器中就是window对象!)
- 实现bind的功能
- 借用其他对象的方法。也就是说可以实现继承(构造函数继承或者构造函数和原型链继承组合式继承或者寄生组合式继承)
区别:参数不一样而已啦~apply只有两个参数,第二个是一个数组或者类数组对象
1.
var banana={
color:"yellow"
}
var apple={
color:"red",
say:function(){//a,b
console.log(this.color)
//console.log([a,b])
}
}
var orange={
color:"orange"
}
var leaf={
color:"green"
}
apple.say();
apple.say.call(orange);//改变this的指向
apple.say.bind(orange)();//
运行结果:
2.call apply实现bind的功能:bind的最大特点:
bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。(这么一说是不是就想起来用闭包实现了呢,其实就是return一个新函数且新函数的参数和bind函数的参数合并)
var banana={
color:"yellow"
}
var apple={
color:"red",
say:function(a,b,c){//
console.log(this.color)
console.log([a,b])
}
}
var orange={
color:"orange"
}
var leaf={
color:"green"
}
apple.say();
apple.say.call(orange);//改变this的指向
apple.say.bind(orange)();//同样改变了this的指向同时生成了一个绑定函数 可以调用绑定函数实现效果
// 怎么实现bind呢
Function.prototype.mybind=function(){
var self=this;//保存函数体中的this
var context=Array.prototype.slice.call(arguments)[0]//要本函数的第一个参数
var args=Array.prototype.slice.call(arguments,1);//要本函数除了第一个参数以外的其他参数
return function(){
return self.apply(context,args.concat(Array.prototype.slice.call(arguments)))//结合这个函数的参数列表
}
}
apple.say.mybind(leaf)(1,2);
apple.say.mybind(leaf,1)(2);
运行结果: