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;
}