JS函数中的apply与call

JS中的call和apply方法

一、方法定义:

(1)apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
(2)call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

二、call 与 apply 的相同点与差异

相同点:

  • 方法的含义是一样的,即方法功能是一样的;
  • 第一个参数的作用是一样的;

不同点:两者传入的列表形式不一样

  • call可以传入多个参数;
  • apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入
  • 函数的第一个参数都是this的指向对象

三、apply()与call()的作用

如何理解这两个函数的实际作用,首先要从JS中函数的本质上理解。JS中函数的本质是对象(引用类型),函数名是指向引用的一个指针,那么函数内部的作用域可以看做是函数名指向的那个引用A的作用域,这个时候函数里面的this指代的就是引用A,而函数有call和apply方法,可以改变当前这个函数所指向的引用,进而改变函数内部this的指向,用于重新定义this

四、举例

(一)、理解this指向

1
2
3
4
5
6
var name = "Morant";
function getMessage(){
console.log(this.name);
}
//这时调用的this指向的是window对象,(直接调用可以看成是兜底的对象调用的)
getMessage();//Morant
1
2
3
4
5
6
7
8
9
var Morant = {
name:"Morant",
age:21,
sayHello:function(){
console.log("My name is "+this.name+","+"I'm "+this.age+" years old" );
}
}
//这里的this指向的是Morant
Morant.sayHello(); //My name is Morant,I'm 21 years old

(二)、使用方法改变this指向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var Morant = {
name:"Morant",
age:21,
sayHello:function(){
console.log("My name is "+this.name+","+"I'm "+this.age+" years old" );
}
}

var Boom = {
name:"Boom",
age:20
}

Morant.sayHello(); //My name is Morant,I'm 21 years old

//将Morant调用方法的this指向从Morant指向Boom,进而使用Morant的方法输出Boom的信息
Morant.sayHello.call(Boom); //My name is Boom,I'm 20 years old
Morant.sayHello.apply(Boom); //My name is Boom,I'm 20 years old

Morant.sayHello.bind(Boom)();//My name is Boom,I'm 20 years old (bind()返回的是一个新的函数)

(三)、方法的参数差别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var Morant = {
name:"Morant",
age:21,
sayHello:function(fm,t){
console.log("My name is "+this.name+","+"I'm from "+fm+" to "+t);
}
}

var Boom = {
name:"Boom",
age:20
}

Morant.sayHello("河南","北京"); //My name is Morant,I'm from 河南 to 北京

Morant.sayHello.call(Boom,"西班牙","比利时"); //My name is Boom,I'm from 西班牙 to 比利时
Morant.sayHello.apply(Boom,["西班牙","比利时"]);// My name is Boom,I'm from 西班牙 to 比利时(只接收两个参数)
Morant.sayHello.bind(Boom,"西班牙","比利时")();// My name is Boom,I'm from 西班牙 to 比利时

call、 bind、 apply 这三个函数的第一个参数都是this的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第n个参数全都用逗号分隔

apply的所有参数都必须放在一个数组里面传进去。

bind除了返回函数以外,它的参数和call 一样。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!