apply,call,bind的相同的点是都可以改变this的指向
var obj = {
name: "张三",
say: function ( str1,str2) {
console.log(this.name+''+str1+''+str2);
}
}
obj.say("早","你好")//张三 你好 这里的this这的是obj这个对象;
obj.say.call({name:"李四"},"早","你好")// 李四 你好 这里的this改成了对象{name:"李四"};
obj.say.apply({name: "王五"},["早","你好"])//王五 你好 这里的this改成了对象{name:"王五"};
obj.say.bind({name: "李六"},"早"",你好")();//李六 你好 这里的this改成了对象{name:"李六"};
这里可以看出,call,apply以及bind都可以把原来的this指向的obj这个对象换为了括号中的这个对象
但是他们也是存在区别的:
1.call,apply以及bind括号中的参数第一个都是this的指向;
2.call后面的参数是调用的函数要传的参数;他和函数中的形参一一对应;
3.apply中的要传给函数的参数要以数组的形式传入;
4.call和apply在改变方法的this指向时,会同时执行方法;而bind不会执行方法,而是返回改变this指向后的新方法,所以bind需要二次调用来返回值,所以后面要加()