我很好奇,因为当我们在大多数示例中访问高级函数时,总是使用call()
方法。
的示例:
Object.prototype.toString.call();
Array.prototype.slice.call();
这是为了惯例还是有其他原因?
答案 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
。选择一个只是一个惯例。