如何确定使用“call”时链接函数的执行方式?

时间:2014-08-15 02:13:02

标签: javascript

例如,在Array.prototype.slice.call(arguments)中,call位于slice之前,但在standard= name.substring(1).toLowerCase() substring之前调用toLowerCase {{1}}。为什么会出现这种差异,如何知道在链接它们时调用哪些订单函数?

3 个答案:

答案 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)

在您的示例中,prototypesliceArray对象的属性:

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)

sliceArray.prototype的属性(恰好是一个函数),您正在使用call来调用该函数(一个功能调用)。 name.substring(1).toLowerCase()将函数substringtoLowerCase(按此顺序)链接起来。