现在的位置: 首页 > 综合 > 正文

js的闭包

2013年12月09日 ⁄ 综合 ⁄ 共 1805字 ⁄ 字号 评论关闭

 js的闭包                 在高级应用中用的多

js的闭包问题

1. js的变量作用域

代码:

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<script type="text/javascript">
/*
var a=90; //定义一个全局变量
function test(){
a=123; //使用外层的 a变量 
}
test();
document.write("a="+a);*/
输出为123 ,注意test函数里面变量a没有带var

/*	var a=90; //定义一个全局变量
function test(){
var a=123; //定义一个局部变量       函数里面有var代表一个局部变量
}
test();
document.write("a="+a);*/

输出为90 ,注意test函数里面变量a带有var

/*	a=90; //没有var ,就会试着去找(父函数 的 a),如果找不到就创建 a
function test(){
a=123; //没有var ,就会试着去找(父函数/外层 的 a),如果找不到就创建 a
}
test();
document.write("a="+a);*/

如果外层和内层的参数都没有var,则,此时输出为123

//测试一下,看看大家理解否?
 a=20;
function test1(){
var a=700;
function test2(){
         a=890;//如果没 var ,则会到父函数去,找a,找到就使用父函数的a,否则创建
   }
     return test2; 。。这个地方意思是把test函数体整体返回,有的语言不可以返回函数,但是JavaScript可以的
}
var var1=test1();
var1();
document.write(a);
</script>
</html>

最后输出结果为20

var a=20;   //如果单这里var 没有,最后结果还是为890
function test1(){
 a=700;
function test2(){
         a=890;//如果没 var ,则会到父函数去,找a,找到就使用父函数的a,否则创建
   }
     return test2; 。。这个地方意思是把test函数体整体返回,有的语言不可以返回函数,但是JavaScript可以的
}
var var1=test1();
var1();  // 如果var1()不执行 则最后结果为700
document.write(a);
</script>
</html>  //最后结果为890

☞ 

① js允许函数中有函数

② 如果使用变量,如果该变量有var ,则表示创建全新的变量 ,如果该变量是直接写在页面,则我们认为是全局变量,否则是局部变量如果没有带var关键字js引擎会这样处理首先到父函数去找有没有该变量,如果有,则使用,如果没有则创建之.

function f1(){
    //var n=999;//局部变量
n=999;//全局变量
  }
f1();
alert(n);

③ 上面的代码说明,如果在一个函数中,直接使用  比如

n=900; 相当于创建了一个全局变量.

js中如何解决从外部读取内部函数的局部变量

function test1(){

var n=90;//布局变量

}

alert(n) //错误

解决方法->闭包

function test1(){
var n=90;
//test1函数的内部函数,可以访问 var n
funciton test2(){
window.alert(n++);
}
//把内部函数test2返回外部调用者
return test2;
}
var res=test1();//调用test1 ,返回 test2函数
这时res就是test1内部函数 test2别名
res();

闭包你可以这样理解 : test2()实现闭包

 闭包的主要用处是

1. 把局部变量保存在内存中,不让垃圾回收机制,将其回收.

2. 让外部去访问内部函数的布局变量.

 js中函数名不能重复

1. 在不同文件中,可以有相同的函数名.

2. 在不同父函数(), 即使在同一个页面,可以有相同函数,比如下面代码

abc.html

function test(){} 
functino test2(){
function sayhello(){
}
}
function test3(){
function sayhello(){
}
}
abc2.html
function test(){}

抱歉!评论已关闭.