JavaScript闭包函数的写法
<script type="text/javascript"> //通过js内置的函数构造器创建函数 var func=new Function('a','b','return a+b'); alert(typeof func); alert(func(3,5)); //和下面的效果一样 var func1=function(a,b){return a+b}; alert(func1(6,7));
//作用域链 var a=1; function test(){ var b=2; return a; } test(); alter(b);
//scope chain 作用域链的效果 var a=1; function test(){ var b=2; function test1(){ var c=3; alert(a); //1 alert(b); //2 alert(c); //3 return c; } test1(); } test();
//词法作用域 function f1(){ var a=1; //局部变量 不存在共享的词法作用域 return f2(); } function f2(){ return a; } alter(f1());//undefined
function f1(){ var a=1; return f2(); } function f2(){ var b=3; //alert(b); return a; } // alter(f1());//undefined var a=55; alert(f1()); //55 //对变量进行重复添加 a=656; alert(f1());
第一种形式的闭包:
function f(){ var a='sunliyuan'; //返回闭包 return function(){ //返回父节a return a; } } // alert(a);//undefined var test=f(); alert(test()); //sunliyuan
第二种形式的闭包:
var n; function f(){ var a='sunliyuan'; n=function(){ return a; }; } f(); alert(n());
第三种形式的闭包:(能够读取其他函数内部变量的一个函数,将函数内部和外部链接起来的一个桥梁)
function f(param){ var n=function(){ return param; } param++; return n; } var test=(456); alert(test()); //457
暴露在外部:
function f1(){ //变量的值始终保持在内存中 var n=1; //定义全局的变量 test=function(){ n+=1; }; function f2(){ alert(n); //1 } return f2; } var res=f1(); alert(res()); //undefined test(); alert(res());
设置和读取:
var setValue,getValue; (function(){ var n=0; //设置和读取 getValue=function(){ return n; }; setValue=function(x){ n=x; } })(); alert(getValue()); // 0 setValue(567); alert(getValue()); //567
迭代器中的应用:
//迭代器中的应用 function test(x){ var i=0; return function(){ return x[i++]; }; } var next=test(['a','b','c','d','e']); alert(next()); //a alert(next()); //b alert(next()); //c alert(next()); //d
//循环中的应用:
function f(){ var a=[]; //应用了该值得指向 var i; for(i=0;i<3;i++){ a[i]=function(){ return i; } } return a; } var test=f(); alert(test[0]()); //3 alert(test[1]()); //3 alert(test[2]()); //3
function f(){ var a=[]; var i; for(i=0;i<3;i++){ //创建自调用的函数 a[i]=(function(x){ return function(){ return x; } })(i); } return a; } var test=f(); alert(test[0]()); //1 alert(test[1]()); //2 alert(test[2]()); //3
//中间变量 function f(){ function test(x){ return function(){ return x; } } var a=[]; var i; for(i=0;i<3;i++){ a[i]=test(i); } return a; } var res=f(); alert(res[0]()); alert(res[1]()); alert(res[2]());