JavaScript闭包的内存效率高吗?

JavaScript闭包的内存效率高吗?,javascript,memory,memory-leaks,closures,Javascript,Memory,Memory Leaks,Closures,我想更好地理解JavaScript闭包对内存的影响: function fee(arg){ function figh(){ //some code fum(passOnSomeARG) } function fo(y){ //some calculations with y } function fum(x){ //some code fo(x) } figh() } 在上面的示例中,是否每次调用“fe

我想更好地理解JavaScript闭包对内存的影响:

function fee(arg){

  function figh(){
    //some code
     fum(passOnSomeARG)
  }     

  function fo(y){
    //some calculations with y
  }

  function fum(x){
    //some code
     fo(x)
  }

  figh()
}
在上面的示例中,是否每次调用“fee()”时都会将内部函数重新读入内存?如果是这样,这是否有效?如果没有,那么发生了什么


旁注:可能会连续多次调用fee()(mouseMove上的循环或鼠标事件)

我想是的。这样做会更有效率:

(function() {
    var figh = function() {
        // some code
        fum(passOnSomeARG);
    };
    var fo = function(y) {
        // some calculations with y
    };
    var fum = function(x) {
        // some code
        fo(x);
    };
    window.fee = function(arg) {
        figh();
    };
})();
考虑以下代码:

function foo(){
  function local(){ ... local code ... }     
  local();
}
在引擎盖下,JS VM将foo()的主体转换为以下序列(伪代码):


因此,每次调用foo时,都会分配一个函数的新实例。通常,函数实例是相对较小的对象,无论其主体有多大。但是仍然会发生分配,堆管理器将忙于收集每次foo()调用后留下的垃圾。

如果您询问是否每次调用
fee
时都会创建这些内部函数,那么是的,尽管我猜实现中有优化来帮助实现这一点。而且,由于内部函数在
fee
调用的生命周期之后不会被存储,因此它们将被垃圾收集。@Kolink的回答仍然显示了一个很好的选择。这里有内部函数,但没有闭包,因为没有外部引用任何内部函数。在下面的Kolink代码中,当语句
window.fee=function(…){…}
创建对内部(匿名)函数的外部引用时,外部(自执行)函数形成一个闭包。这里要记住的金科玉律是,只有当存在对内部函数的持久外部引用时,才会形成闭包。内部函数本身不会导致闭包的形成。@Beetroot Beetroot,这意味着通过外部引用,它可以防止内部函数被垃圾收集,从而防止它们被重新创建?不完全是这样。若再次调用外部函数,那个么将创建内部函数的新实例——有时这是必需的。当存在对至少一个内部函数的外部引用时,就会形成闭包,通过外部引用调用内部函数可以访问闭包形成时存在的其他内部成员(在本例中为函数)。闭包的本质是保留整个外部环境,但只有外部引用存在的内部函数才能访问闭包。+1,无效函数/变量混合语法除外。;)@user1689607:到底什么是无效的?@c-smile:看看这个。在某些特殊情况下,闭包是有帮助的,例如。但是,它可能会有负面的性能特征,特别是在多次执行(如在循环中)时。如果不需要,就不要使用它。可能值得注意的是,在循环中形成闭包是非常有用的,甚至是必要的,以便在循环完成后(内部函数)可以访问依赖于循环的值。在执行正确构造的代码时,这样的闭包都将包含成员,这些成员在形成循环时反映循环因变量的值。这样做的成本是工作内存(RAM)的消耗,而不是性能本身。如果处理得当,这一成本不必太高。
var local = new Function({bytecode: local code});
local();