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

3

我试图理解下面的代码(来自MDN关于Array.prototype.slice的文章),以了解其运行过程中发生的事情。

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

我的理解是return语句获得了对Array.prototype.slice方法的引用。这引出了我的第一个问题,“既然这是slice方法的引用,为什么它不需要被调用,例如Array.prototype.slice().call(arguments)?”

假设这是对slice方法的调用,并且由于没有立即传递参数,我的第二个问题是“JS是否‘看到’链接到slice的call方法,然后尝试从call(arguments)方法中解析一个值传递给slice?”

如果是这种情况,那么这种方法链接是如何进行的?JS是从左到右执行链接操作的吗?当没有明确传递参数给一个方法时,它会尝试从后续方法中解析一个值来隐式地返回给左侧的“空”调用者吗? 谢谢。

3个回答

3
  1. 为什么不需要调用它? — 因为,正如您所说,它是一个引用,这就是所需的全部。代码需要对函数的引用,而不是从调用函数返回的结果。

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

总的来说,代码所做的是从Array原型"借用".slice()方法,并将其用作如果arguments对象是一个数组。

有时你会看到像这样写:

return [].slice.call(arguments);

它稍微缩短了长度,而且通过创建另一个未使用的数组实例来完成相同的操作。


1
谢谢。我之前没理解这个:
结果就是,slice() 会被调用,就好像是 arguments.slice() 这样调用的一样
但你的解释帮助我更好地理解了JS在这里的操作。还要感谢下面的其他回答,它们也很有帮助!
- lance-p

3
在JavaScript中,call是一种在函数内调用方法的方式,它将函数内this的上下文硬绑定到传递给它的参数。如果想了解更多关于call的详细信息,请查看以下链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call 如果您想了解更多关于this以及为什么要使用call的信息,我强烈建议您阅读此GitHub库:https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/ch1.md 其次,默认情况下,JS中的每个常规函数表达式都有一个arguments对象,它是一个可迭代对象,即传递给该函数的参数列表。
function foo()
{
console.log(arguments); //1,2
}
foo(1,2)

更多关于arguments的信息,请访问以下链接:https://www.google.co.in/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=arguments%20in%20javascript 如果您想要系统地学习JavaScript,可以参考以下资源:https://github.com/getify/You-Dont-Know-JS

2
请查看Function.prototype.call()文档:

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

由于.callFunction.prototype的一部分,因此每个函数都将其作为属性,包括Array.prototype.slice[].slice
根据Array.prototype.slice的文档:

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

它正在获取Array.prototype.slice属性(函数)的引用并运行其.call函数。 call的第一个参数是上下文(或this值),任何其他参数都传递给链接的方法。 .slice()不需要任何参数,如果没有参数,则返回元素作为数组。
所以,正在发生的是它正在获取arguments - 它实际上不是一个数组,只是一个“类似数组”的对象(具有数字属性和.length属性) - 并像它是一个数组一样运行.slice()。 这使它将arguments转换为数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接