call
、apply
、bind
的作用是改变函数运行时this
的指向。
-
call()
的第一个参数为this绑定的对象,后面传入一串参数列表。
当第一参数为null
或undefined
时,默认指向window对象
。 -
apply()
和call()
类似,唯一的不同点在于第二个参数传入一个参数数组。
当第一参数为null
或undefined
时,默认指向window对象
。 -
bind()
和call()
类似,不同点一bind()
不会立即执行,而是返回一个改变了this
后的函数;
不同点二在于当你调用fn1 = fn.bind(newThis,param1)
方法后,执行fn2(prama2)
时,参数prama2
会加到param1
后面。
示例代码:
let obj1 = {
name: 'obj1',
fn1(param) {
console.log(this.name, param);
}
}
let obj2 = {
name: 'obj2',
fn1(param) {
console.log(this.name, param);
}
}
//一般调用
obj1.fn1('param1') //输出 obj1 param1
//call的第一参数为调用该函数的对象时,等价于一般调用
obj1.fn1.call(obj1, 'param1') //输出 obj1 param1
//改变this指针,指向obj2
obj1.fn1.call(obj2, 'param1') //输出 obj2 param1
//apply的第二个参数为参数数组
obj1.fn1.apply(obj2, ['param1']) //输出 obj2 param1
//bind方法返回一个函数,但不会执行,这个函数的参数继承bind方法的参数
let fun = obj1.fn1.bind(obj2, 'param')
fun() //输出 obj2 param1