function Set() {          // This is the constructor
    this.values = {};     
    this.n = 0;          
    this.add.apply(this, arguments);  // All arguments are values to add
}
// Add each of the arguments to the set.
Set.prototype.add = function() {
    /* Code to add properties to the object's values property */
    return this;
};这是"Javascript:权威指南“中用来创建”Set“类的代码的开始。我试图使构造函数中apply()函数的必要性变得合理,但终究弄不明白。
this.add.apply(this, arguments);如果add()函数已经是'this‘调用的方法,那么核心apply()函数实现的目的或用途是什么。提前感谢任何试图向我解释这一点的人
http://jsfiddle.net/Marlin/Ydwgv/ -来自Javascript的完整示例:权威指南
发布于 2011-09-13 11:48:04
“如果add()函数已经是由'this‘调用的方法,那么核心应用()函数实现的目的或用途是什么。”
这样arguments就可以作为整个集合传递。如果Set接受不确定数量的参数,则此函数非常有用。
发布于 2011-09-13 11:48:09
构造函数中不需要它--事实上,它与一般的构造函数没有任何关系(但显然它与这个特定的构造函数有关;-)。apply所做的就是确保目标函数被“正确”调用。
也就是说,apply,当给定一个类似数组的对象* (arguments计数)、[n1, n2, ... n3]和一个函数f时,它会将目标函数调用为f(n1, n2, ... n3)。apply还接受"this context“,该上下文在代码中传递给新创建的对象(以使其看起来好像add是”作为普通方法“被调用的)。有关更多信息/示例,请参阅上面的链接。
这意味着,对于上面的代码,
var s = new Set(1, 2, 3)和
var s = new Set()
s.add(1, 2, 3)是等价的。
祝你编码愉快。
*在FireFox 4之前的版本中,它必须是数组本身。这就是为什么有时代码会使用丑陋的习惯用法:
f.apply(context, Array.prototype.slice.call(arguments, 0))发布于 2011-09-13 11:48:27
我相信调用它不是为了作用域,而是apply将接受一个参数数组并按顺序传递它们:
this.add.apply(this, [1,2,3,4]);
....
function add(one, two, three, four)没有一个参数是数组
https://stackoverflow.com/questions/7396552
复制相似问题