-
闭包的概念
闭包是一个函数和其词法环境的引用捆绑在一起的组合。通俗来讲,闭包是指可以访问其所在的外部函数中声明的变量和参数的内部函数。
在JavaScript中,所有函数都是天生闭包的(除了 new Funciton),每当创建一个函数,闭包就会在函数创建的时候被创建出来。
JavaScript的函数闭包这一特性与变量作用域和词法环境有关。
闭包的例子:
function f1(){
var n=999;
function f2(){ //f2就是闭包
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
-
闭包的用途
- 访问其他函数的内部变量
- 保护变量不被内存清理机制回收
- 避免全局变量的污染,加强封装性
-
闭包的缺点
- 闭包会使函数中的变量保存在内存中,内存占用很大,要在退出函数之前删除不使用的局部变量。
- 闭包会在父函数外部,改变父函数内部变量的值。
- 理论上,函数的词法环境可以达到的所有的外部变量都应存在。实际上,JS引擎会试图优化掉未使用的外部变量。
function f() { let value = Math.random(); function g() { debugger; // 在 Console 中:输入 alert(value); No such variable! } return g; } let g = f(); g();在V8引擎(Chrome,Edge)中,当代码执行暂停时,在控制台中输入
alert(value), 会报错“No such variable”.理论上,它应该是可以访问的,但引擎把它优化掉了,会导致调试问题。