关于call()方法的一点疑问?

function ArrayOf(){ 
  return [].slice.call(arguments); 
} 

这个函数式是实现将arguments转换成数组。
但是我有个疑问就是这个call()方法不是第一个参数不是指向this对象吗?为啥这个表达式[].slice.call(arguments)中,我感觉arguments怎么变成了参数了传入到空数组中了?
实在不知道这个实现原理?有没有大佬能让我醍醐灌顶

阅读 2.5k
3 个回答

functionName.call的参数是(绑定对象,方法参数),相当于绑定对象.functionName(方法参数)。 对应本例,arguments这个数组做了绑定对象,相当于执行了arguments.slice()[].slice只是表示借用了数组的slice方法。

PS.深挖一下,其实slice这个方法实现中应该有个this,使用call(绑定对象)的方式调用它,绑定对象会充当这个this(这是call或apply真正干的事情),看例子,一看就懂

function addAge() {
    this.age = 18;
}
let boy = {};
addAge.call(boy);
console.log(boy.age); //18

[].slice 是在获取 slice 方法

function ArrayOf() {
    const slice = [].slice
    return slice.call(arguments)
}

这么看你就明白了。

给类数组 arguments 调用Array 的方法 slice, 使其变为真正的数组

可以称为方法借用, [].slice 是一个方法, 借给 arguments 用用, 得到 arugments 的数组副本

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题