例如,我写了这段代码:
const a = [1,2,3,4,5]
const res = a.slice.call(a)
console.log(res)
为什么切片没有括号?因为它的回报价值,是吗?或者我错了?
为什么我不能写这样的代码:
const a = [1,2,3,4,5]
const res = a.slice(0, a.length).call(a)
console.log(res)
有什么问题?
答案 0 :(得分:3)
来自docs,
call()方法调用一个给定此值的函数 论据单独提供。
a.slice
是一个函数,函数具有调用method
函数的调用slice
。
const a = [1,2,3,4,5]
const b = [1,2];
const res = a.slice.call(b) // calls the function with context of b
console.log(res); // [1,2]

另一方面,a.slice(0, a.length)
返回一个数组,而数组没有call
函数,这将导致错误。
答案 1 :(得分:3)
a.slice
是一个引用Array.prototype.slice
的函数。函数在其原型上也有函数,包括call
- 就像a.slice()
a
引用数组一样,你可以fn.call()
fn
call
}指的是一个函数。
但在第二个示例中,您尝试在数组上使用a.slice(0, a.length)
,而不是函数:Array
解析为数组< / em>,call
原型没有call
方法。您只能对具有call
属性的对象(包括函数)使用call
,或者在其中一个原型对象上具有{{1}}属性。{/ p>
答案 2 :(得分:2)
a.slice.call(a)
正在使用slice
方法调用a
作为上下文。 call
:
call()方法调用一个函数,该函数具有给定的值和单独提供的参数。
顺便说一下,这与做同样的事情:
a.slice()
。
const a = [1,2,3,4,5]
console.log(a.slice.call(a));
console.log(a.slice());
&#13;
请参阅代码段。两个结果都是一样的。
后一个例子确实:
a.slice(0, a.length).call(a)
在call
的结果上调用slice
,这是一个数组。 call
是Function
而不是Array
的方法,因此这不起作用。