日期:2014-05-16  浏览次数:20423 次

js闭包的两种模式

<html>
<body>

<script>
/*
js闭包概念;

1闭包的方式:
?1.1自运行模式(无需调用)。
??(function(params_declare){//params_declare 参数声明
???//使用params_declare do something
??})(parms_value);//parms_value要求是参数值

?1.2?方法对象模式:
??function Fun(parms){
???var innerParams;//内部参数
???function innerFun(){//内部函数要求没有参数
????//利用fun的参数和innerParmas参数 do something
????//注意:innerFun对innerParams的变动,会影响每一个Fun的实例化的对象
???}
???return innerFun;//必须没有括号
??}
?调用示例:?var fun = new Fun("参数列表");
????fun();//实质是调用innerFun方法,此时innerParams是内部的一个"全局"变量
*/

?//自运行模式示例:当用户先后按住键盘的ctrl+enter的时候,弹出消息。其中preCode,clickCount是闭包的全局变量
?(function(mess){
??var clickCount=0;//记录时间触发次数的变量
??var preCode="";//记录前一个键盘的Code的便来那个,用于判断是不是ctrl键
??document.body.onkeydown = function(){
??if(preCode=="17" && event.keyCode=="13"){
???clickCount++;//自增
???alert(mess+",次数:"+clickCount);//第一次提示消息:"触发事件,次数:1",第二次提示消息:"触发事件,次数:2"
??}else{
???preCode=event.keyCode;//记录前一个键盘的Code
??}
?}})("触发事件");

?//函数对象模式示例
?function Fun(j){
?? var i=1;
???
?? function innerFun(){
???alert("j+i="+(j+i));
???i+=j;//注意:innerFun对innerParams的变动,会影响每一个Fun的实例化的对象
?? }
?? return innerFun;
?}
?var fun =new Fun(10);
?fun();//11
?fun();//21

?

?

?

//方法返回的是一个带参数的函数

?function add(toadd){
??//再次强调:内部函数可以带参数,且可以如下简化写法
??return function(baseNumber){
??????? return toadd+baseNumber;
??}
??
??/*or
??function addWith(baseNumber){
???return toadd+baseNumber;
??}
??return addWith;
??*/
?}

//调用

?var addFun = add(2);//addFun是一个方法 function(num){return 2+num};
?var res = addFun(9);//11
?var res2 = add(2)(4);//6
?var res23 = add(23)(1)//24

?alert(res);

</script>

</body>
</html>

?

?