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

时间:2016-04-15 12:53:06

标签: javascript callback call

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

的示例:

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

这是为了惯例还是有其他原因?

3 个答案:

答案 0 :(得分:4)

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

一个简单的例子:

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

在某些特殊情况下,this / call的{​​{1}}参数将作为apply传递,原始参数将被忽略。像,

object

上面的示例将访问传递的var x = document.querySelectorAll("div") Array.prototype.slice.call(x); //This will convert the nodeList to an array. length)的this属性,并将构造一个新数组并将其返回。您必须阅读slice的算法才能了解更多信息。内部this is how the slice will works,我的答案。

答案 1 :(得分:1)

两者都是相同的,你可以pass comma separated arguments和另一个array。我没有看到任何其他区别,如果在bind中你可以在later context使用返回的函数,而内部函数仍然具有外部函数' s scope

答案 2 :(得分:1)

只要您不传递.call之外的参数(即第一个参数),

.apply等同于this。选择一个只是一个惯例。