没有括号的短格式调用方法?

时间:2018-06-15 03:27:18

标签: javascript

例如,我写了这段代码:

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)

有什么问题?

3 个答案:

答案 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()

&#13;
&#13;
const a = [1,2,3,4,5]

console.log(a.slice.call(a));
console.log(a.slice());
&#13;
&#13;
&#13;

请参阅代码段。两个结果都是一样的。

后一个例子确实:

a.slice(0, a.length).call(a)

call的结果上调用slice,这是一个数组。 callFunction而不是Array的方法,因此这不起作用。