忘记了是在哪里看到的这个案例讲解,简单明了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>闭包</title>
<style>
</style>
</head>
<body>
</body>
<script>
var count=10;//全局作用域 标记为flag1
function add(){
var count=0;//函数全局作用域 标记为flag2
console.log(count)
return function(){
count+=1;//函数的内部作用域
alert(count);
}
}
var s=add()
console.log(s)
s();//输出1
s();//输出2
function add1(){
var count1=0;//函数全局作用域
return function(){
count1+=1;//函数的内部作用域
alert(count1);
}
}
add1()();//输出1
add1()();//输出1
//它的用处有两个,一个是前面提到的可以读取函数内部的变量
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
//另一个就是让这些变量的值始终保持在内存中。
function f3(){
var n=999;
nAdd=function(){n+=1}
function f4(){
alert(n);
}
return f4;
}
var result=f3();
result(); // 999
nAdd();
result(); // 1000
// 为什么会这样呢?原因就在于f3是f4的父函数,而f3被赋给了一个全局变量,这导致f3始终在内存中,而f4的存在依赖于f3,因此f4也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
</script>
</html>