前言
函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。也就是说,闭包 可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。 — MDN Web docs
什么是“闭包”
在MDN JavaScript官方文档上对“闭包”的描述是:函数与其状态即词法环境的引用,共同构成闭包。用更通俗的话来讲就是:闭包就是能够读取其他函数内部变量的函数。简单来说,闭包是一种函数,一种定义在函数内部的函数。本质上,闭包就是将函数内部和外部连接在一起的一座桥梁。 例子🌰:
function func1(){
var number = 999;
function func2(){
console.log(number);
}
return func2();
}
var result = func1();
result(); // "999"
var function(){
}
其中 func2函数,就是闭包。
闭包的作用
- 在外部能够读取函数内部的变量。
- 使变量的值一直存在于内存当中。
- 使用闭包模拟私有方法。
示例代码:
function func1(){
var number = 999;
addFunc = function(){
number += 1;
}
function func2(){
console.log(number);
}
return func2;
}
var result = func1();
result(); // "999"
addFunc();
result(); //"1000"
闭包会产生的问题(注意事项)
- 由于闭包会使得函数中的变量都被保存在内存之中,即使函数已经执行完毕,这些局部变量也不会被垃圾回收器自动回收,有某些环境下容易导致内存泄漏。正确做法是,在退出函数之前,将不使用的变量都删除清空。
- 闭包会改变函数的值,而不只是改变函数变量的一个副本。
- 循环闭包问题。
引用
本文参考: