什么是闭包
我遇到的两个解释:
- 我们举个例子,有一个函数A。函数A里还定义了一个函数B,当我们不管把函数B放在哪个地方去调用,我们都可以让B能够在A函数的词法作用域中生效,意思就是B函数不管咋样都能访问到A函数,这样的一个现象我们称之为闭包。
- 闭包是函数的特性,即便只有一个函数,也可以说他行成了闭包,内部的变量外部不可读,因为外部还有个全局的作用域包裹着它。
闭包有什么作用?
- 在我们团队开发时,每个开发者把自己写的代码都放在一个私有的作用域中,只用return和window.xxx的方法让私有作用域里的东西传在全局下去(保护作用)。
- 我们可以通过闭包使遍历时,每次创造出来的私有的作用域保存下来(保存作用)。
闭包的实际应用
现在我们要把十个函数放入一个数组arr中,需要这么做?按照常规操作我们会这样写,如下:
function test() {
var arr = []
for (var i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
}
}
return arr
}
var myArr = test()
for (var i = 0; i < 10; i++) {
myArr[i]()
}
但是这样写输出的结果是什么呢?答案:输出了10个10。
提问:为什么答案是这样的呢?
说通俗点就是:嗐!就是函数里的for循环遍历完十次之后,第一个i = 0都还没有存入到函数体里去,而遍历的操作已经做完了,导致i已经等于10时,第一次存值的操作才进行完。所以十次存值的操作,存进去的结果都是10。
提问:那怎么样解决这个问题呢?
我们可以写一个闭包,把每一次的i都储存下来。
function test() {
var arr = []
for(var i = 0; i < 10; i++){
(function(j){
arr[j] = function() {
console.log(j)
}
})(i)
}
return arr
}
var myArr = test()
for(var i = 0; i < 10; i++){
myArr[i]()
}
闭包的缺陷
闭包会造成内存的持续累加,导致到最后由于内存过大而无法运行代码。