call()、apply()、bind() 都是用来重定义 this 这个对象的
代码
var obj1 = {
name: '小红',
age: 18,
fn: function(arg1, arg2) {
console.log(this.name, '+ 参数传递为', arg1, arg2);
}
}
var obj2 = {
name: '小蓝',
sex:'男'
}
obj1.fn.call(obj1, 'call1', 'call2') // 输出小蓝 + 参数传递为 call1 call2
obj1.fn.bind(obj2, 'bind1', 'bind2')() // 输出小蓝 + 参数传递为 bind1 bind2
obj1.fn.apply(obj2, ['apply1', 'apply2']) // 输出小蓝 + 参数传递为 apply1 apply2
首先我们可以看到, 这三个方法都是改变了this的指向,原obj1的指向为本身 使用之后都指向了obj2
区别:
我们看输出可以看出来,最后结果都一样 区别在于传参的方式和返回的结果
call 和 bind都是通过多个参数传递(argument1, argment2,...)这样的方式传递,但是bind返回结果是一个函数,我们必须执行这个函数 这就是为什么后面有一个"()"
然后apply和其他两个的不同就是在于参数只能传递在一个参数中,通过数组方式传递([argument1, argument2,....])
这就是效果和不同点和共同点,以上分享为个人观点,有错误望指出
特殊使用
1.比如
obj1.fn.apply(null, ['null1', 'null2']) // undefined + 参数传递为 null1 null2
这种情况是没有什么代替的,但是需要用数组形式传递参数 就可以使用这样的操作