我试图了解如何阅读下面的代码(摘自MDN&#39的Array.prototype.slice上的文章),以了解运行时会发生什么。
function list() {
return Array.prototype.slice.call(arguments);
}
我的理解是return语句获取对Array.protoype.slice方法的引用。这导致了我的第一个问题,"如果这是对切片方法的引用,为什么不需要调用它,例如, Array.prototype.slice()调用(参数)&#34。?;
假设这是对slice方法的调用,并且由于没有任何参数立即传递给它,我的第二个问题是"是JS'看到'将调用方法链接到切片然后尝试解析一个值以从调用(参数)方法传递到切片?"
如果是这种情况,这个方法是否链接,这就是JS执行链接操作的方式:从左到右,当没有参数明确传递给方法时,它会尝试从后续方法中解析一个值以返回隐含在"空"左边的被叫? 感谢。
答案 0 :(得分:3)
为什么不需要调用它? - 因为,正如你所说,它是一个参考,这就是所需要的。代码需要引用函数,而不是调用函数返回的结果。
JS'看到'调用方法被连接到切片然后尝试解析一个值以从调用(参数)方法传递给切片吗? - 我不确定那意味着什么。对.slice()
函数的引用用于访问.call()
方法(继承自Function原型)。调用该函数(slice.call
)并将arguments
对象作为其第一个参数传递。结果是slice
将被调用,就好像它被称为arguments.slice()
一样 - 这是不可能直接调用的,因为.slice()
函数不可用。
总的来说,代码正在做的是从Array原型“借用”.slice()
方法并使用它,好像arguments
对象是一个数组。
有时你会看到这样写的:
return [].slice.call(arguments);
它有点短,并且它做同样的事情(以创建一个未使用的数组实例为代价)。
答案 1 :(得分:3)
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)
如果你想正确学习JS,盲目地通过这个回购:
答案 2 :(得分:2)
查看Function.prototype.call()
的文档:
call()
方法调用具有给定值的函数和单独提供的参数。
由于.call
是Function.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
成一个数组。