【发布时间】:2015-06-08 15:13:14
【问题描述】:
我正在通过在线 TUT 学习 javaScript 中的 call 和 apply。此函数允许传递更多参数,而不是固定数量。
var calculate = function(){
var fn = Array.prototype.pop.apply(arguments);
return fn.apply(null, arguments);
};
这句话让我难以理解。
var fn = Array.prototype.pop.apply(arguments);
TUT的演示者,解释如下:
我们将apply 方法绑定到arguments 对象上。这将为我们提供Function Object 并将其分配给 fn 变量。它还将从argumentsObject 中删除Function Object。因为数组的pop method 获取数组中的最后一个元素,所以它将它从数组中删除,然后分配给曾经调用过的方法。在这种情况下,fn 变量。
让我感到困惑的是:
我们将
apply方法绑定到arguments对象上。这是 会给我们Function Object它还会从
arguments中删除Function Object对象。
而当我们在return语句中写:
return fn.apply(null, arguments);
我们为什么要包含null?
【问题讨论】:
-
这段代码不验证我称之为的任何方式
-
在
apply中,第一个参数是上下文(this)。在Array.prototype.pop.apply(arguments)中,您使用arguments作为上下文,它是一个类似数组的对象(不是实际的Array对象)。那是因为你不能做arguments.pop(),因为arguments不共享Array.prototype...它实际上不是Array对象。 -
所以在第一个
apply中,你不需要第二个参数。但是,在fn.apply(null, arguments)中,您将null作为第一个参数传入,因为不需要上下文。但是,您将arguments作为第二个参数传入,因为它可以被函数使用。 -
我不知道为什么人们一直关闭这个问题......
-
arguments 是伪数组,在其上调用 pop(获取最后一个元素 = 函数),然后在其余参数上运行它。计算(1,2,3,4,5,function() { console.log(arguments); });
标签: javascript arrays