闭包的概念:
闭包是指有权访问另一个函数作用域中的变量的函数。
如以下代码:
function outside() {
let name = 'zs';
function inside() {
console.log(name);
}
}
在outside函数内部定义的函数inside访问了outside函数内部的变量,这就产生了闭包。
闭包的作用:
闭包可以用在很多地方,它最大的作用有两个:
1.可以读取函数内部的变量
2.让这些变量的值始终保存在内存中
如下代码:
function outside() {
let name = 'zs';
return function inside() {
console.log(name);
}
}
let f = outside();
f();
运行以上代码会打印出zs,从上面的例子可以看出在outside函数的内部变量被外部引用了。
下面介绍变量的值始终保存在内存的例子
function outside(){
let n=999;
nAdd = function() {
n += 1
};
function inside() {
console.log(n);
}
return inside;
}
let f = outside();
f(); // 打印999
nAdd();
f(); // 打印1000
在这段代码中,f实际上就是inside函数。它一共运行了两次,第一次控制台打印999,第二次控制台打印1000。这证明了,函数outside中的局部变量n一直保存在内存中,并没有在outside调用后被自动清除。因为outside是inside的父函数,而inside被赋给了一个全局变量f,这导致inside始终在内存中,而inside的存在依赖于outside,因此outside也始终在内存中,不会在调用结束后,被垃圾回收机制(garbagecollection)回收。这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以可以在函数外部对函数内部的局部变量进行操作。
网友评论