例如,我编写以下代码:
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)
问题出在哪里?
来自文档,
call(( 方法调用具有给定此值的函数,并且 单独提供的参数。
a.slice
是一个函数,函数具有调用slice
函数的调用method
。
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
函数,这将导致错误。
a.slice
是一个引用Array.prototype.slice
的函数。函数在其原型上也有函数,包括call
- 就像你可以在a
引用数组的地方做a.slice()
一样,你可以在fn
引用函数的地方做fn.call()
。
但是在第二个示例中,您尝试在数组而不是函数上使用call
:a.slice(0, a.length)
解析为数组,并且Array
原型没有call
方法。只能对具有call
属性的对象(包括函数(或在其原型对象之一上具有call
属性的对象(包括函数(使用call
。
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());
请参阅代码段。两个结果是相同的。
后一个示例执行:
a.slice(0, a.length).call(a)
这是在slice
的结果上调用call
,这是一个数组。call
是一种Function
不Array
的方法,所以这不起作用。