【发布时间】:2015-06-22 20:52:04
【问题描述】:
我正在阅读 Javascript Ninja 的秘密,遇到了一个我无法完全理解的示例。之前这里的其他一些用户也引用了同样的例子,但他们的疑问与我的不同。示例如下:
function addMethod(object, name, fn) {
var old = object[name];
object[name] = function(){
if (fn.length == arguments.length)
return fn.apply(this, arguments)
else if (typeof old == 'function')
return old.apply(this, arguments);
};
}
这是一个函数重载的例子,这样使用:
var ninja = {};
addMethod(ninja,'whatever',function(){ /* do something */ });
addMethod(ninja,'whatever',function(a){ /* do something else */ });
addMethod(ninja,'whatever',function(a,b){ /* yet something else */ });
我对范围、闭包和 apply() 的使用有深入的了解。我的疑问是:
- fn.length 将返回 fn 中定义的参数数量。 arguments.length 会返回哪些参数的数量吗?已经存在的函数?
- 但如果是这样,并且它们匹配,为什么它会应用 NEW 函数而不是现有函数?
- 如果 arguments.length 返回给定函数的编号,那么它们何时会不同?
- 我添加了10个方法,从无参数开始,每次增加数量,添加第10个方法后,我调用没有参数的方法,它在哪里“存储”了第一个函数?
- 我不明白这里 old 的用法。
我可能没有一些可以回答所有问题的关键概念。请随意给我一个解释,而不是单独回答问题。
【问题讨论】:
-
1.
arguments.length将是传递给调用它的最近的外部函数的参数 #。 2.它将应用与您添加的方法具有相同调用签名的一个,否则转到最后一个添加的方法。 3.arguments.length返回传递的内容,而不是定义的内容。 4. as old,每个方法都使用闭包来查看。基本上,它会从 10 个参数开始,如果没有 10,则尝试 9,如果不是 9,则尝试 8,一直回到形式参数与参数匹配的那个。 -
顺便说一句,这是设置可变参数方法的一种非常缓慢且需要大量内存的方法。如果可能的话,arity 分支都应该在一个函数中定义,使用类似
switch(arguments.length)的东西来处理路由。
标签: javascript function methods overloading