<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>闭包初次接触</title>
<script type="text/javascript">
var n=999;
function f(){
alert(n);
}
f();
function f2(){
var m=999; //一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
}
//m is not defined
//alert(m); //此处:外部是获取不到函数内部的局部变量的
function f22(){
k=777; //没有用var,则是全局变量
}
f22();
alert(k);
//那么怎么获取到函数内部的局部变量呢?----闭包
//闭包:定义在一个函数内部的函数,就是能够读取其他函数内部变量的函数。
function f3(){
var p=888;
function f4(){
alert(p);
}
return f4;//
}
var result=f3();
result();
//闭包可以用在许多地方。它的最大用处有两个,
//一个是前面提到的可以读取函数内部的变量
//另一个就是让这些变量的值始终保持在内存中。
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>匿名函数和闭包</title>
<script type="text/javascript">
//另一个就是让这些变量的值始终保持在内存中。
function f(){
var n=999;
nAdd=function(){n+=1;}//匿名函数,本身就是个闭包,没有var,是个全局变量
function f2(){
alert(n);
}
return f2;
}
var result=f(); //返回局部变量n的值
result();
nAdd(); //n+1后返回1000,说明n一直在内存中
result();
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>闭包使用</title>
<script type="text/javascript">
var name="The Window";
var object={
name:"My Object",
getNameFunc:function(){
return function(){
return this.name; }
}
}
alert(object.name);
alert(object.getNameFunc()());
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>闭包使用</title>
<script type="text/javascript">
function outerFun(){
var a=0;
function innerFun(){
a++;
alert(a);
}
return innerFun;
}
var obj=outerFun();
obj();
obj();
var obj2=outerFun();
obj2();
obj2();
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>闭包使用</title>
<script type="text/javascript">
function outerFun(){
var a=0;
alert(a);
}
var a=4;
outerFun();
alert(a);//结果是 0,4 . 因为在函数内部使用了var关键字 维护a的作用域在outFun()内部.
function outerFun2(){
a=0;//没有var
alert(a);
}
var a=4;
outerFun2();
alert(a);//结果为 0,0 真是奇怪,为什么呢?
//作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .
//当执行a=0时,因为没有使用var关键字,
//因此赋值操作会沿着作用域链到var a=4; 并改变其值.
</script>
</head>
<body>
</body>
</html>