call()、apply()、bind()都是Function原型上的方法(所有的函数都是Function的实例,所以所有函数都支持这三种方法)
用途都是改变this的指向。
var name="张三",age=18; var obj = { name:"李四", oldAge:this.age, myFn:function(a, b){ console.log( this.name+"年龄"+this.age,"来自"+a+"去往"+b ) } } var newObj = { name:"王五", age:22 } obj.myFn.call(newObj,'北京','上海'); // 王五年龄22 来自北京去往上海 obj.myFn.apply(newObj,['北京','上海']); // 王五年龄22 来自北京去往上海 obj.myFn.bind(newObj,['北京','上海'])(); //王五年龄22 来自北京,上海去往undefined obj.myFn.bind(newObj,'北京','上海')(); // 王五年龄22 来自北京去往上海
call()、apply()、bind()的相同点:
第一个参数相同,都是this要绑定的对象
call()、apply()、bind()的不同点:
- call 的第二、第三……第 N 个参数,全都用逗号分隔 obj.myFn.call(newObj,'北京','上海')
- apply 的第二、第三……第 N 个参数,全都放在一个数组 obj.myFn.apply(newObj,['北京','上海'])
- bind 的传参方法与call相同,但因bind会返回一个新的函数,所以必须再次调用才会执行,即还需加上(),如obj.myFn.bind(newObj,'北京','上海')();