Javascript重载函数

Javascript重载函数,javascript,Javascript,所以我在读一本书,它使用这个方法来重载函数- 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 o

所以我在读一本书,它使用这个方法来重载函数-

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);
    }
  }
}
我有几个问题要问

  • 调用传入的函数时,为什么fn.length仍在作用域中?执行addMethod不应该导致fn超出范围吗
  • 为什么参数不引用匿名函数的arguments属性,而不是fn函数的arguments属性?(我该怎么想?)
  • 参数“fn”在范围内,因为JavaScript就是这样工作的。这是匿名函数闭包的一部分
  • 创建的匿名函数将替换绑定到属性名为“name”的对象的原始函数。调用时,它通过查看
    arguments
    对象来检查在该特定调用上实际传递的参数。如果它看到传递的参数数量与“fn”函数中形式参数的数量相同,那么它将调用该函数。否则,它将调用前一个(“旧”)函数(如果它存在并且是函数)。
    需要了解的一个关键问题是,函数实例的
    .length
    属性提供声明中形式参数的数量。例如,该“addMethod”函数的
    .length
    将是
    3

  • JavaScript中闭包的工作方式花了我一段时间才真正“理解”,因为我是一名C程序员很长时间了。在这样的语言中,函数调用局部变量(etc)的空间是在堆栈上分配的,当函数退出时,它会从堆栈中弹出。JavaScript就是不这样工作。

    所以在调用该函数时fn仍然存在,因为匿名函数的闭包中存在对fn的引用?是的。从实际函数调用到“addMethod”的参数(本质上是一个局部变量)将永远“停留”;只要对象属性(被替换的函数)仍然存在。因此,对新替换函数的每次调用都将能够访问它。请注意,只有当原始函数(如果存在)具有不同数量的参数时,它才会重载。很明显,因为javascript是非类型化的,但值得一提的是,其他一些(类型化的)语言允许使用相同的参数计数进行重载。结果是,您不能“重载”不需要使用其所有参数的函数。(x=x | | 0;…)