例如,在Array.prototype.slice.call(arguments)
中,call
位于slice
之前,但在standard= name.substring(1).toLowerCase()
substring
之前调用toLowerCase
{{1}}。为什么会出现这种差异,如何知道在链接它们时调用哪些订单函数?
答案 0 :(得分:1)
我认为你误解了一些事情......它只是
Array.prototype.slice.call(arguments)
只调用一个slice()
.call()
调用slice()
函数,.call()
是slice
所以
call()
使用提供的上下文和参数调用上一个方法。它从右到左直到call()
关于链接
链接 只是意味着您使用您调用的函数的返回值,该值是包含您再次调用的方法的对象。所以它从左到右发生
最好的例子是
var firststr = "my house".substring(2); //then this returns a string
var secondstr = firststr.trim(); //method call trim() on the return of .substring()
可以改写为
"my house".substring(2).trim();
必读:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
答案 1 :(得分:0)
在您的示例中,prototype
和slice
是Array
对象的属性:
Array.prototype.slice // On the Array.prototype object, get `.slice` property
然后,使用.slice
属性,获取属性.call
并执行该属性。在此示例中,只有.call()
是方法调用(例如函数调用)。这根本不是链接。这只是嵌套的属性声明,而不是链接。
像你的另一个例子一样链接:
var standard = name.substring(1).toLowerCase()
从左到右执行。执行name.substring(1)
,并且在该方法的返回结果中,调用.toLowerCase()
方法。仅当先前方法为后续方法返回适当的对象类型时,链接才有效。在这种情况下,name.substring(1)
返回一个新的字符串对象,并在该新的字符串对象上调用.toLowerCase()
。因此事情从左到右执行。
答案 2 :(得分:0)
slice
是Array.prototype
的属性(恰好是一个函数),您正在使用call
来调用该函数(一个功能调用)。 name.substring(1).toLowerCase()
将函数substring
和toLowerCase
(按此顺序)链接起来。