先看看简单的栗子
function fn1(){ var n=999; function fn2(){ alert(n); } return fn2; } var result=fn1(); result(); // 999
啥是闭包??
网友答:
- 闭包就是能够读取其他函数内部变量的函数
- 闭包归根结底个人认为只是一个作用域链的不同吧,其实理解了作用域链个人感觉不是太难
- 闭包就是将函数内部和函数外部连接起来的一座桥梁
其实也正如大家所言,闭包就是能够读取到函数内部的变量,同时让这些变量处于内存当中,不会被垃圾回收机制所回收。也正因此闭包也有缺点,浪费内存,所以要在退出函数后,将局部变量删除。不要随便在父函数外部改变父函数内部的变量。
摘抄几段话
- 只要存在调用内部函数的可能,JavaScript就需要保留被引用的函数。而且JavaScript运行时需要跟踪引用这个内部函数的所有变量,直到最后一个变量废弃,JavaScript的垃圾收集器才能释放相应的内存空间
- 当内部函数在定义它的作用域的外部被引用时,就创建了该内部函数的一个闭包。这种情况下我们称既不是内部函数局部变量,也不是其参数的变量为自由变量,称外部函数的调用环境为封闭闭包的环境
- 从本质上讲,如果内部函数引用了位于外部函数中的变量,相当于授权该变量能够被延迟使用。因此,当外部函数调用完成后,这些变量的内存不会被释放(最后的值会保存),闭包仍然需要使用它们
- 对外部函数的调用会创建这些闭包的新实例,同时也会创建新的封闭环境,本质上是创建了一个新对象,自由变量就是这个对象的实例变量,而闭包就是这个对象的实例方法