为什么在构造函数中需要apply()函数
Why is the apply() function needed in the constructor
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的完整示例:权威指南
"如果add()函数已经是由'this'调用的方法,那么apply()核心函数的目的或用途是什么? "
以便arguments
可以作为整个集合传递。如果Set
接受不确定数量的参数,
在构造函数中不需要它——事实上,它与一般的构造函数无关(但显然对这个特定的构造函数很重要;-)。apply
所做的是确保目标函数被"正确"调用。
即apply
,当给定一个类数组对象* (arguments
计数)、[n1, n2, ... n3]
和一个函数f
时,它将调用目标函数f(n1, n2, ... n3)
。apply
还接受"this上下文",该上下文在代码中传递给新创建的对象(使其看起来好像add
被称为"普通方法")。查看上面的链接以获得更多信息/示例。
这意味着,对于上面的代码,
var s = new Set(1, 2, 3)
和
var s = new Set()
s.add(1, 2, 3)
是等价的。
幸福的编码。
*在FireFox 4之前,它必须是Array-proper。这就是为什么有时代码使用难看的习惯用法:
f.apply(context, Array.prototype.slice.call(arguments, 0))
我认为它被调用不是为了作用域,而是应用程序将接受一个参数数组并按顺序传递它们:
this.add.apply(this, [1,2,3,4]);
....
function add(one, two, three, four)
没有一个参数是数组
函数的apply
方法允许您通过传递数组而不是项列表来调用函数。
function add(a, b) {
return a+b;
}
var values = [1,2];
alert(add.apply(this, values));
3.所以,本质上,你在这里所做的是允许你的构造函数接受任意数量的参数,然后你将它们一次性全部传递给add
函数。所以,如果你要用:
var stack = new Set(1,2,3,4,5,6,7,8,9);
所有这些值都将传递给add
函数,就像您写的那样:
this.add(1,2,3,4,5,6,7,8,9);
使用.apply()
语法允许您将参数数组传递给正在调用的函数。在本例中,它正在传递arguments
对象,这意味着它正在使用传递给Set构造函数的任何和所有参数调用add()
。因此,你可以用任意数量的值创建新的Set对象,例如,输入
var mySet = new Set(13,42,18,19,44,11,5);
所有这些值都将传递给add()
- Javascript:如何获取函数.apply()的键
- 是否可以在不更改上下文的情况下调用函数.apply
- 如何通过 Function.prototype.apply() 更改调用函数的参数
- 通过fn.apply或fn.bind将函数传递给setTimeout
- 了解窗口调整大小事件与 scope.$apply 与函数$watch
- 节点redis't喜欢函数.apply()
- 未捕获的类型错误:hook.apply不是在react路由器中使用onEnter时的函数
- 函数式编程 - .bind.apply for curry function.
- JS:.apply(null,arguments)——为什么我的函数被调用一次,而console.log被调用多次
- 函数 (){ 返回 fn.apply(me, arguments); } 作为回调
- 将函数绑定到baz后调用fn.apply(bar,[])
- 使用数组-apply()中的参数调用函数,但不使用上下文参数
- 类型错误: $scope.apply 不是一个函数
- $.when.apply.done 不执行异步函数
- node.js 使用 function.prototype.apply 执行的泛型函数
- KNOCKOUT.js问题:“H.apply不是一个函数.(在'h.apply(e,r)'中,'
- 如果不在Angular.js中使用$apply(),我该如何编写此函数
- 为什么在构造函数中需要apply()函数
- Internet Explorer - javascript “apply” 函数在 window.external e
- 实现 Function.prototype.apply 函数