call、apply、bind 都是函数对象的方法,并且都会改变this指向
1、call() 和 apply() 会立即调用函数执行;bind() 不会立即执行
2、3个方法 都可以将 一个对象 作为 第一个参数传递,并且函数 this 的指向会指向传递的对象
3、使用 3个方法 传递的 第一个对象为隐含参数,不会作为函数形参
4、函数接收的参数,是 第一个对象之后的 依次传递的参数
1、call(对象,参数1,参数2,…,参数n)
function fun(a, b) {
console.log(this, a, b)
}
let obj1 = { a: 1 }
fun.call(obj1, 1, 1);
this 指向了传递的对象 obj1,对象后的参数 依次成为 函数的 实参
2、apply(对象,[参数1,参数2,…,参数n])
function fun(a, b) {
console.log(this, a, b)
}
let obj2 = { b: 2 }
fun.apply(obj2, [2, 2]);
this 也同样指向了传递的对象 obj2,对象后的参数 必须是 数组,函数依次接收数组为参数
3、bind(对象,参数1,参数2,…,参数n)
function fun(a, b) {
console.log(this, a, b)
}
let obj3 = { c: 3 }
let bind = fun.bind(obj3, 3, 3);// 返回方法,等待执行
bind();// 调用返回方法
this 也同样指向了传递的对象 obj3,对象后的参数 依次成为 函数的 实参
但是 bind() 不是立即执行的,它会返回一个方法,调用返回方法,才能立即执行
区别:
call(对象,参数1,参数2,…,参数n):
- 立即执行,更改this指向;参数无限,依次传递
apply(对象,[参数1,参数2,…,参数n]):
- 立即执行,更改this指向;对象之后,只有一个参数,参数必须已数组封装
bind(对象,参数1,参数2,…,参数n):
- 等待执行,返回一个方法,调用方法执行;更改this指向;参数无限,依次传递