MDN JS Array.prototype.slice.call示例说明

时间:2016-06-23 15:24:09

标签: javascript

我试图了解如何阅读下面的代码(摘自MDN&#39的Array.prototype.slice上的文章),以了解运行时会发生什么。

function list() {
   return Array.prototype.slice.call(arguments);
}

我的理解是return语句获取对Array.protoype.slice方法的引用。这导致了我的第一个问题,"如果这是对切片方法的引用,为什么不需要调用它,例如, Array.prototype.slice()调用(参数)&#34。?;

假设这是对slice方法的调用,并且由于没有任何参数立即传递给它,我的第二个问题是"是JS'看到'将调用方法链接到切片然后尝试解析一个值以从调用(参数)方法传递到切片?"

如果是这种情况,这个方法是否链接,这就是JS执行链接操作的方式:从左到右,当没有参数明确传递给方法时,它会尝试从后续方法中解析一个值以返回隐含在"空"左边的被叫? 感谢。

3 个答案:

答案 0 :(得分:3)

  1. 为什么不需要调用它? - 因为,正如你所说,它是一个参考,这就是所需要的。代码需要引用函数,而不是调用函数返回的结果。

  2. JS'看到'调用方法被连接到切片然后尝试解析一个值以从调用(参数)方法传递给切片吗? - 我不确定那意味着什么。对.slice()函数的引用用于访问.call()方法(继承自Function原型)。调用该函数(slice.call)并将arguments对象作为其第一个参数传递。结果是slice将被调用,就好像它被称为arguments.slice()一样 - 这是不可能直接调用的,因为.slice()函数不可用。

    < / LI>

    总的来说,代码正在做的是从Array原型“借用”.slice()方法并使用它,好像arguments对象是一个数组。

    有时你会看到这样写的:

    return [].slice.call(arguments);
    

    它有点短,并且它做同样的事情(以创建一个未使用的数组实例为代价)。

答案 1 :(得分:3)

javascript中的

call是一种在函数中调用方法的方法,它将函数中this的上下文硬绑定到传递给它的参数。有关{{1的更多详细信息通过下面的链接

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

如果您想了解更多有关call以及为何使用this的信息,我强烈建议您浏览此github回购:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/ch1.md

其次,默认情况下,JS中的每个常规函数表达式都有一个call对象,它是一个arguments,它只是传递给该函数的参数列表。

iterable

有关function foo() { console.log(arguments); //1,2 } foo(1,2)

的更多信息

https://www.google.co.in/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=arguments%20in%20javascript

如果你想正确学习JS,盲目地通过这个回购:

https://github.com/getify/You-Dont-Know-JS

答案 2 :(得分:2)

查看Function.prototype.call()的文档:

  

call()方法调用具有给定值的函数和单独提供的参数。

由于.callFunction.prototype的一部分,每个函数都将其作为属性,包括Array.prototype.slice(或[].slice)。< / p>

根据Array.prototype.slice的文档:

  

如果 begin 未定义,则切片从索引0开始。如果省略 end ,则切片将在序列的末尾(arr.length)提取。< / p>

它获取对Array.prototype.slice属性(函数)的引用并运行其.call函数。要调用的第一个参数是上下文(或this值),并且任何其他参数都将传递给链式方法。 .slice()不需要任何参数,没有任何参数只会将元素作为数组返回。

所以,正在发生的是它正在采用arguments - 这实际上并不是一个数组,只是一个类似数组的&#34;&#34;对象(具有数字属性和.length属性) - 并在其上运行.slice(),就像它是一个数组。这使得r&#34;转换&#34; arguments成一个数组。