JS闭包问题

function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);

上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。
  但是,由于tmp仍存在于bar闭包的内部,所以它还是会自加1,而且你每次调用bar时它都会自加1.不理解为什么会每次调用都加1,求大神解释

阅读 4.1k
4 个回答

这是一个作用域和内存释放的问题。

通常,当函数调用完成后,函数使用的内部变量会释放。但是,有些情况函数内部的变量并不会释放(很危险,可能会内存泄漏)。

回到这道题,当 var bar = foo(2) 时,因为返回值是一个函数,函数引用了 tmp 变量,所以 tmp 变量并不会被释放,一直保留在函数内,并且保留了自己的值。

所以每次调用时会执行 ++tmp 加一。

每次调用tmp都会+1
匿名函数一直引用着x和tmp这个量,x不变,tmp调用一次+1

因为tmp一直驻留在内存中,JS函数并不是返回后,就被回收了的,其实JS函数有点类似于对象了,JS很多面向对象的实现,都可以通过函数来实现

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题