关于闭包的理解,是在写完函数结构的时候就形成的吗?

function aaa(){
    var a=1;
    var b=2;
    function bbb(){
        alert(b)//问题1:“内部函数引用了b,b就不会被垃圾回收机制回收”;意思是否是只要写完这个函数结构就形成引用 “b” 了?
    }
}
阅读 2.8k
4 个回答

内部函数可以看做一个闭包,闭包是可以由另外一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。 满足三个条件

  • 必须是一个嵌套的函数。

  • 闭包必须返回嵌套函数。

  • 嵌套函数必须引用一个外部的非全局的局部自由变量。

function aaa(){
    var a=1;
    var b=2;
    function bbb(){
       alert(b)
    }
    return bbb
}

var f = aaa()
f() // 在这里,每次调用f(),还能访问到b的值,所以是闭包。
// 只要f存在,就一直能访问到b,所以b不能被垃圾回收
  • bbb是一个嵌套函数,满足第一点。

  • aaa返回了嵌套函数bbb,满足第二点。

  • bbb引用了非全局局部变量b,满足第三点。

function aaa(){
    var a=1;
    var b=2;
    function bbb(){
       alert(b)
    }
    return bbb() // 这样写不是闭包,这样只能算作一个嵌套函数而已。返回的必须是嵌套函数!!!
}
// var result = aaa()
// 之后,再也访问不到b的值,bbb执行完之后b被回收了。

以下链接谈到Python的闭包,不过概念是类似的。 http://imtuzi.com/post/5-pyth...

闭包的意义在于:当函数执行完毕的时候,你仍旧可以访问到这个函数内部的一些变量。

如果你没有在a函数内部抛出一个闭包b,然后这个闭包b被引用。是无法称之为闭包的。因为这个函数a内部的东西你肯定获取不到,马上就会被垃圾收集。

不是,引用是在函数调用执行过程中形成的。

不是的,你将 bbb 函数 return 出去,用一个变量 c 来接收,然后执行c,此时 c 就引用了 bbb ,而 bbb 又引用了 aaa 中的 b 变量,所有 aaa 不会被回收

function aaa(){
    var a=1;
    var b=2;
    return function bbb(){
        alert(b)
    }
}

var c = aaa(); 此时的 c 引用了 bbb ,间接引用了 aaa ,形成闭包
c(); // alert 2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题