all() 和 apply() 的区别和作用

2021-03-02 14:33发布

5条回答

call() 和apply()的第一个参数相同,就是指定的对象。这个对象就是该函数的执行上下文。

call()和apply()的区别就在于,两者接收的参数不一样。

三岁奶猫
3楼 · 2021-03-03 13:35

call()方法和apply()方法的作用相同:改变this指向。 区别 他们的区别在于接收参数的方式不同: call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。

apply( )

apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作为函数参数所组成的数组。

var obj = {
    name : 'linxin',
}
function func(firstName, lastName){
    console.log(firstName   ' '   this.name   ' '   lastName);
}
func.apply(obj, ['A', 'B']); // A linxin B

可以看到,obj 是作为函数上下文的对象,函数 func() 中 this 指向了 obj 这个对象。参数 A 和 B 是放在数组中传入 func() 函数,分别对应 func()参数的列表元素

call( )

call 方法第一个参数也是作为函数上下文的对象,但是后面传入的是一个参数列表,而不是单个数组。

var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(firstName   ' '   this.name   ' '   lastName);
}

func.call(obj, 'C', 'D');  // C linxin D

对比 apply 我们可以看到区别,C 和 D 是作为单独的参数传给 func 函数,而不是放到数组中。

对于什么时候该用什么方法,其实不用纠结。如果你的参数本来就存在一个数组中,那自然就用 apply,如果参数比较散乱相互之间没什么关联,就用 call。

以上内容来源于github上https://github.com/lin-xin/blog/issues/7

以上不管哪一种如果使用arguments实参列表,使用方法都一样

var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(arguments[0]   ' '   this.name   ' '   arguments[1] );
}

func.call(obj, 'C', 'D');  // C linxin D    

//使用arguments看的只是他的实参列表;不管你是数组还是参数列表都一样
var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(arguments[0]   ' '   this.name   ' '   arguments[1] );
}

func.apply(obj, 'C', 'D');  // C linxin D


灰机带翅膀
5楼 · 2021-03-05 11:05

call 和 apply的简单用法:绑定一些函数,用于传参调用。

比如 : Math.max.apply(this,[1,2,3,4]);可以求出最大值。

一般来说 this 总是指向调用某个方法的对象,但是再使用call、apply方法的时候,就会改变this的指向



我的网名不再改
6楼 · 2021-03-05 16:24

ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已。

apply( )

apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作为函数参数所组成的数组。

var obj = {
    name : 'linxin',
}
function func(firstName, lastName){
    console.log(firstName   ' '   this.name   ' '   lastName);
}
func.apply(obj, ['A', 'B']); // A linxin B

可以看到,obj 是作为函数上下文的对象,函数 func() 中 this 指向了 obj 这个对象。参数 A 和 B 是放在数组中传入 func() 函数,分别对应 func()参数的列表元素

call( )

call 方法第一个参数也是作为函数上下文的对象,但是后面传入的是一个参数列表,而不是单个数组。

var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(firstName   ' '   this.name   ' '   lastName);
}

func.call(obj, 'C', 'D');  // C linxin D

对比 apply 我们可以看到区别,C 和 D 是作为单独的参数传给 func 函数,而不是放到数组中。

对于什么时候该用什么方法,其实不用纠结。如果你的参数本来就存在一个数组中,那自然就用 apply,如果参数比较散乱相互之间没什么关联,就用 call。

以上内容来源于github上https://github.com/lin-xin/blog/issues/7

以上不管哪一种如果使用arguments实参列表,使用方法都一样

var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(arguments[0]   ' '   this.name   ' '   arguments[1] );
}

func.call(obj, 'C', 'D');  // C linxin D    

//使用arguments看的只是他的实参列表;不管你是数组还是参数列表都一样
var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(arguments[0]   ' '   this.name   ' '   arguments[1] );
}

func.apply(obj, 'C', 'D');  // C linxin D