【闭包】
定义:闭包就是一个函数
条件:一个函数去嵌套另外一个函数,里边的函数就是闭包
function f1(){
function f2(){
}
}
特点:闭包函数有权访问父级环境的变量信息。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>14-闭包</title>
<script type="text/javascript">
//简单闭包
//以下f1函数,只要执行完毕,name和addr变量就被销毁了
function f1(){
var name="tom";
var addr="beijing";
function f2(){
console.log(AO.name+"--"+AO.addr);
}
return f2;
} //ff是f2函数的引用,因此调用ff函数的效果与调用f2函数效果一致
var ff = f1(); //name和addr由于f1函数执行完毕,会被销毁
//ff()函数执行后也可以访问到name和addr的信息
//原因:name和addr在 //name和addr由于f1函数声明好之后,已经“固定”为f2执行环境内部AO的属性了
//和外部环境的变量没有直接交互关系。 //name和addr由于f1函数执行完毕,本身的作用域链被销毁
//但是f2函数内部的AO并没有被销毁,还有ff来指引它 ff(); //tom--beijing
</script>
</head>
<body> </body>
</html>
14-闭包
1 案例-闭包计数器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>15-闭包-计数器</title>
<script type="text/javascript">
//①传统计数器
var num=0;
function add_num(){
return ++num;
}
console.log(add_num()); //1
console.log(add_num()); //2
console.log(add_num()); //3
console.log(add_num()); //4
//函数销毁就不能调用
//当前计数器不好的地方是计数基数容易被污染,导致计数错误
num=100;
console.log(add_num()); //101 // </script>
</head>
<body> </body>
</html>
15-闭包-计数器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>16-闭包-计数器</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" /> <script type="text/javascript"> //②闭包计数器 function f1(){
var num =0;
function f2(){
return ++num;
}
return f2;
}
var add_num = f1(); console.log(add_num()); //1
console.log(add_num()); //2
//由于计数器基数是f1函数内部的局部变量
//这样在外部就由于作用域链的关系不可能修改f1内部的num变量信息
num = 200;
console.log(add_num()); //3 </script> <style type="text/css">
</style>
</head> <body> </body>
</html>
16-闭包-计数器
总结:
1.作用域链
在js里边有环境,每个函数都是一个环境,最外部是window环境
每个环境的内部都有AO的活动对象
AO对象把当前环境可以访问的变量信息保存为本身的属性
环境是否有权访问一个变量信息,直接通过AO就可以知道
作用:
① 内部环境可以访问外部环境的变量信息,反之不可以
② 变量访问顺序是“先声明、后使用”
① 变量的作用域是定义时候决定的,不是运行时
2.闭包
闭包就是一个函数