关于闭包的不理解之处
function test1(){
var i ={name:’nyf’};
}
function test2(){
var i ={name:’nyf’};
return i;
}
var m1 = test1();
var m2 = test2();
这样的话局部变量i没有释放,算不算构成闭包,为什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
楼主的例子当然不算闭包,因为这两个函数执行完之后作用域的“引用”就“销毁”(准备被垃圾回收了)。
闭包的例子
以上2个都不算是闭包
1) 在一个函数内声明了另一个内部函数才有可能形成闭包
2)如果声明的函数没有使用其外层函数的变量,那么不能形成闭包,如果引用到就会形成闭包
如下,没有闭包形成
test1/test2没有声明过内部函数,就不具备形成闭包的必须条件
如下,就会有闭包形成
或
或
闭包形成的是一个函数的作用域链,一个函数A内需要访问其外层函数定义的变量,就会形成函数A的闭包,这是一个静态的概念,在函数声明的时候就形成~~~~
不算,因为m2不能访问到test2()内部的作用域。只是单纯引用了i,然后这个test2()里的i就被销毁了。
这样m3就是等于引用了一个匿名函数,可以通过m3()来得到返回的i值,到这步才算是闭包。
因为这个函数被引用着,所以test3的作用域没有被销毁。
大家的的回答都很nice,但是只能采纳一个答案,谢谢
闭包闭包,首先要被包起来。
用什么来包?
Javascript只有六种数据类型,
function
和object
似乎都能实现包起来的要求(复杂的数据组合)。其次,所谓的闭,就是作用域,变量只在封闭的范围内有效。
那么只剩下
function
能实现了,因为只有function
才有作用域的概念。但显然并非所有的
function
都可以称为闭包
。我们知道,
JS
中的function
能够访问它们的:参数;
局部变量或函数(它自己内部定义的);
外部变量,包括
如果一个函数访问了它的外部变量,那么它就是一个闭包。
从技术上来讲,在JS中,每个function都可能是闭包,因为它总是能访问在它外部定义的数据。
http://kb.cnblogs.com/page/110782/