日期:2014-05-16 浏览次数:20444 次
<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>
?
?