0

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

http://ejohn.org/blog/javascript-method-overloading/

功能:

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(this, arguments)参数长度都会减一。

我使用警报来跟踪该功能,这是我无法理解的主要内容。

任何帮助将不胜感激。

4

1 回答 1

0

它有效地导致一系列old函数被一个接一个地调用,直到arguments.length找到一个其数量匹配的函数。因此,在第一次调用 时addMethod,您最终将old成为undefined

第二次调用addMethodold最终将成为第一次调用期间分配的函数。

如果你运行这个:

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

它将查找users带有标识符的属性find。它会找到一个,并且该函数的元数将为 2(因为addMethod构造函数中的最终调用创建了一个需要 2 个参数的方法)。因此,它不是调用它,而是调用old,这将是需要 1 个参数的方法的版本。我们的调用只有一个参数,并且匹配,所以这就是被执行的方法。

如果你运行这个:

users.find();

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

于 2013-01-29T15:12:21.287 回答