apply()、call()的用法和拓展运算符

首先,这两个方法作用相同,唯一的区别就是参数传入的格式的不同。
apply 的参数格式是 Function.apply(obj,args)
call 的参数格式是 Function.call(obj,a,b,c)
接下来讲一下对apply用法的理解

Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)

这样看来还是不太清晰,接下来给例子

function add(a,b){
  console.log(this.name);
  return a+b;  
}
function sub(a,b){
  console.log(this);
  return a-b;  
}
const testnum = {
  name:'111',
  age:'12',
}
var a1 = add.apply(testnum,[4,2]);  //sub调用add的方法
var a2 = sub.apply(add,[4,2]);
console.log(a1);  
console.log(a2);  
----------------------------------------------------------
输出:
111
[Function: add]
6
2

这样可以比较直观的看到传进去的this是什么,换句话说,你可以在一个函数的内部调用另一个函数的方法或对象属性

apply() 这个方法还有另外的作用,他可以把参数格式 arg=[a,b,c] 在调用的函数中转变为 arg=(a,b,c)

function test (a,b,c){
  console.log('test');
  console.log(arguments);
}
test.apply(null,[1,2,3])
test([1,2,3]);

------------------------------------------------------
输出:
test
{ '0': 1, '1': 2, '2': 3 }
test
{ '0': [ 1, 2, 3 ] }

如果只需要调用apply()方法,不需要传入obj时,第一个参数直接用null即可

这里有个跟ES6相关的语法,…拓展运算法

test.apply(null,[1,2,3])
test.(…[1,2,3])

这两个输出的内容一样,所以拓展运算法可以用来代替apply

猜你喜欢

转载自blog.csdn.net/kelly0721/article/details/84858844
今日推荐