Object.prototype.toString.call(),为什么在大多数示例中使用call()而不是apply()?

4

我很好奇,因为在大多数示例中,当我们访问高级功能时,总是使用call()方法。

例如:

Object.prototype.toString.call();
Array.prototype.slice.call();

这是出于传统还是其他原因?

这些示例可能不需要将参数作为数组传递。 - Rajaprabhu Aravindasamy
3个回答

4

基本上,call() 期望以逗号分隔的格式传递参数,而 apply() 则期望将参数作为数组传递。因此,您所看到的示例可能不需要将参数作为数组传递。这是一个选择问题。

一个简单的例子:

Math.max.call(Math, 1,2,3,4,5);
//is same as 
Math.max.apply(Math, [1,2,3,4,5]);

在一些特殊情况下,call/applythis参数将作为一个对象传递,并且原始参数将被忽略。例如,

var x = document.querySelectorAll("div")
Array.prototype.slice.call(x);
//This will convert the nodeList to an array.

上面的示例将访问传递的“this”(一个“nodeList”)的length属性,构造一个新数组并返回它。您需要阅读slice算法以了解更多信息。而这就是slice如何内部工作,我回答的一个问题。

1
两者都可以实现相同的功能,其中一个可以使用逗号分隔的参数,另一个可以使用数组。我没有看到其他区别,如果在bind中您可以在稍后的上下文中使用返回的函数,并且内部函数仍具有外部函数的作用域。

1

.call 相当于 .apply 只要你不传递除 this(即第一个参数)以外的其他参数。选择一个而不是另一个只是一种惯例。


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