Javascript 如果内部函数不';不要使用外部变量的任何变量?

Javascript 如果内部函数不';不要使用外部变量的任何变量?,javascript,performance,function,scope,Javascript,Performance,Function,Scope,例如,如果我有 function routine(n){ function subroutine(n){ return n+1; } return subroutine(n*n); } 每次调用例程时是否重新创建子例程 那么,我应该使用 var routine = (function(){ function subroutine(n){ return n+1; } return function(n){ subroutin

例如,如果我有

function routine(n){
   function subroutine(n){
      return n+1;
   }
   return subroutine(n*n);
}
每次调用
例程时是否重新创建
子例程

那么,我应该使用

var routine = (function(){
   function subroutine(n){
      return n+1;
   }
   return function(n){
      subroutine(n*n);
   }
})();

相反?

是的,它被多次创建。您可以查看更多信息

是,它是多次创建的

为什么你不能直接使用:

function routine(n){
   return function (n){
      return (n*n)+1;
   };
}
或:


或者这只是一个例子?

“每次调用例程时是否都会重新创建子例程?”是的。这样做的性能增益是多少?它返回的是函数而不是值。这是另一回事?这只是一个简化的例子。在这种情况下,当然最好使用
函数例程(n){return n*n+1;}
这仍然会每次创建一个新函数,并且它与问题中的
例程
函数不同。@Shawn31313您的函数正在返回一个函数。问题中的一个返回调用内部函数的结果谢谢,这是一篇非常有趣的文章。但我认为浏览器应该优化它,而不是每次都重新创建内部函数,如果他们不使用外部函数的任何参数的话。@Oriol为什么要麻烦呢?如果
例程
中有任何局部变量,它们也应该在
子例程
范围中可用,这样就缩小了所讨论的函数类型。这是如此之小的函数百分比,以至于浏览器检查它是没有意义的。基本上,浏览器唯一可以优化的是,如果
例程
的内容只是一个函数……在这种情况下,对于
例程
函数来说,一开始就是一个函数是很简单的……javascript甚至都懒得对尾部递归进行实际优化。他们确实对这种情况进行了优化,代码也不会被重新创建。但是函数对象(之后得到GCed)是。@Ian啊,你说得对。我应该说“内部函数不使用外部函数的任何变量”,我已经更新了这个问题。我不认为它们占这么小的比例,我已经用过很多次了(但它们当然是少数)。
function routine(n){
   return (n*n)+1;
}