javascript函数重载操作详细信息

javascript函数重载操作详细信息,javascript,Javascript,我读过Jhon resig关于函数重载的帖子: 职能: function Users(){ addMethod(this, "find", function(){ // Find all users... }); addMethod(this, "find", function(name){ // Find a user by name }); addMethod(this, "find", function(first, last){ // Fin

我读过Jhon resig关于函数重载的帖子:

职能:

function Users(){
  addMethod(this, "find", function(){
    // Find all users...
  });
  addMethod(this, "find", function(name){
    // Find a user by name
  });
  addMethod(this, "find", function(first, last){
    // Find a user by first and last name
  });
}

// addMethod - By John Resig (MIT Licensed)
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 );
    };
}
我理解这个概念。有一件事我不明白,为什么每次
else if
语句执行
return old.apply(这是参数)
时,参数长度都会减少1

我使用警报来跟踪功能,这是我无法理解的主要问题


任何帮助都将不胜感激。

它有效地导致了一系列的
旧的
函数被一个接一个地调用,直到找到一个其算术匹配
参数.length
的函数。因此,在第一次调用
addMethod
时,您将得到
old
未定义的

第二次调用
addMethod
old
将成为第一次调用中分配的函数

如果运行此命令:

var users = new Users();
users.find("James");
users.find();
它将查找标识符为
find
users
属性。它将找到一个,该函数的arity为2(因为构造函数中对
addMethod
的最后一次调用创建了一个需要2个参数的方法)。因此,它不调用它,而是调用
old
,这将是需要1个参数的方法的版本。我们的调用只有一个参数,并且匹配,所以这就是执行的方法

如果运行此命令:

var users = new Users();
users.find("James");
users.find();

它将完全按照我上面描述的那样执行,但是当它调用
old
时,该arity将不匹配,它将再次调用
old
。在这种情况下,
old
的值将是第一次调用
addMethod
后的值(这是一个通常称为闭包的东西的演示-在父函数返回后,old
old
函数仍然可用)。

它被递减,因为它是这样编写的。第三个
find
实现需要3个参数,第二个需要2个参数,第一个可以在没有任何参数的情况下调用。让第三个实现使用5个参数,第二个实现使用3个参数,它将递减2:)MikeM:function(){if(fn.length==arguments.length)返回fn.apply(这是参数);else if(typeof old=='function'){alert(“fn:+fn.length+”参数:+arguments.length);return old.apply(this,arguments);}}如果我理解正确,find(arg1,arg2)的属性old defind为find(arg1,arg2)find(arg1)的旧属性定义为find(),find()的旧属性定义为undefind是正确的吗?是的,我想你明白了,尽管你在注释中犯了一个小错误-
find(a1,a2)
有效地将其
旧的
属性设置为
find(a1)
。请注意,您提到的“减量”只是一个副作用,在这种情况下,
addMethod
已被调用3次,每次的参数数量都在增加。