闭包基本概念:
闭包是一个特殊的函数,使一个作用域有权访问另一个作用域的局部变量,代码上来看就是子函数访问父函数的局部变量并返回的函数。
什么是作用域?
作用域规定了变量能够被访问的‘范围’,离开了这个范围变量就不能被访问。
闭包的作用:
(1)闭包可以创建外部可以访问的隔离作用域
(2)避免全局变量污染,延长变量的作用范围。
闭包的缺点:
(1):导致变量不会被垃圾回收机制回收,造成内存消耗
(2):不恰当的使用闭包可能会造成内存泄漏的问题
闭包的应用场景:
var load = (function () {
var obj = {}
return {
getResult(id) {
if (id in obj) {
return 'obj里已经缓存到了id' + id
}
else {
obj[id] = id
return 'obj中之前没有id' + id + ',现在已经下载好了'
}
}
}
}
)()
console.log(load.getResult(10)); // obj中之前没有id10,现在已经下载好了
console.log(load.getResult(12)); //obj中之前没有id12,现在已经下载好了
console.log(load.getResult(10)); //obj里已经缓存到了id10
练习:
function add(){
var count = 0;
return function(){
count += 1;
console.log(count);
}
}
var fun1 = add();
var fun2 = add();
fun1();//1
fun1();//2
fun2();//1
每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址。所以说虽然fun1和fun2都是add(),但是呢都创建了新地址,都是自己的,互不干扰。