我
什么是闭包(closure),为什么使用闭包?
难度:
闭包是函数和声明该函数的词法环境的组合。词法作用域中使用的域,是变量在代码中声明的位置所决定的。闭包是即使被外部函数返回,依然可以访问到外部(封闭)函数作用域的函数。
可以这样理解:闭包 =『函数』和『函数体内可访问的变量总和』
举个简单的例子:
js
(function () {
var a = 1;
function add() {
var b = 2;
var sum = b + a;
console.log(sum); // 3
}
add();
})();
add
函数本身,以及其内部可访问的变量,即 a = 1
,这两个组合在一起就被称为闭包,仅此而已。
为什么使用闭包?
- 利用闭包实现数据私有化或模拟私有方法。这个方式也称为模块模式(module pattern)。
- 部分参数函数(partial applications)柯里化(currying).
闭包最大的作用就是隐藏变量,闭包的一大特性就是内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后
基于此特性,JavaScript 可以实现私有变量、特权变量、储存变量等
我们就以私有变量举例,私有变量的实现方法很多,有靠约定的(变量名前加_
),有靠 Proxy
代理的,也有靠 Symbol
这种新数据类型的。
但是真正广泛流行的其实是使用闭包。
js
function Person() {
var name = "cxk";
this.getName = function () {
return name;
};
this.setName = function (value) {
name = value;
};
}
const cxk = new Person();
console.log(cxk.getName()); //cxk
cxk.setName("jntm");
console.log(cxk.getName()); //jntm
console.log(name); //name is not defined
函数体内的 var name = 'cxk'
只有 getName
和 setName
两个函数可以访问,外部无法访问,相对于将变量私有化。