apply
apply
方法 它接受一个参数数组apply
方法的第一个参数是this
的值。- 第二个参数是一个数组,数组中的元素作为参数传递给函数。
apply
方法调用一个函数,并指定 this
和一个包含参数的数组(或类数组对象)。
function greet(greeting,arg,aa){
console.log(greeting) // hello
console.log(this) // {name:'zhangsan'}
console.log(greeting+','+this.name+arg+aa) // hello,zhangsan!###
}
const person = {name:'zhangsan'}
greet.apply(person,['hello','!','###'])
call
call
方法调用一个函数,允许你传递参数列表给这个函数。call
方法的第一个参数是this
的值,在函数执行时使用。- 其余参数是传递给函数的参数。
call
方法调用一个函数,并指定 this
和一系列参数。
function sayHello() {
console.log(`Hello, ${this.name}`);
}const person = { name: "Alice" };
sayHello.call(person); // 输出: Hello, Alicefunction greet(greeting,arg,aa){
console.log(greeting) // hello
console.log(this) //{name:'zhangsan'}
console.log(greeting+','+this.name+','+arg+','+aa) //hello,zhangsan,jon,undefined
}
const person = {name:'zhangsan'}
greet.call(person,'hello','jon')
bind
bind
方法创建一个新的函数,当你调用这个新函数时,它的this
值会被设置为你在bind
方法中指定的值。bind
方法的第一个参数也是this
的值。- 其余参数是当新函数被调用时,传递给原函数的参数
bind
方法创建一个新的函数,当这个新函数被调用时,this
指向指定的值,并且预先传入一个或多个参数。
function greet(greeting,arg,aa){
console.log(greeting) // hello
console.log(this) //{name:'zhangsan'}
console.log(greeting+','+this.name+','+arg+','+aa) //hello,zhangsan,&&&,%
}
const person = {name:'zhangsan'}
const newGret = greet.bind(person,'hello','&&&','%')
newGret('**')
区别总结:
-
参数传递方式:
apply
: 接受两个参数,第一个是this
指向,第二个是参数数组。call
: 接受多个参数,第一个是this
指向,后面是逐个传递的参数。bind
: 接受多个参数,第一个是this
指向,后面是逐个传递的参数,但它返回一个新的函数,而不是立即执行。
-
立即执行与延迟执行:
apply
和call
都是立即调用函数。bind
返回一个新的函数,可以在以后调用。
-
主要用途:
apply
常用于需要将一个数组作为参数传递给一个函数的场景。call
常用于函数需要直接传递参数的场景。bind
常用于需要创建一个带有特定this
值的新函数,并在以后某个时刻执行的场景。- 使用场景:
call
和apply
通常用于立即调用函数并需要动态传递参数的场景,而bind
用于创建一个预设了this
值的新函数,可能稍后调用。