这是从javascript王者归来里摘抄的例子,用来说明一下闭包!
第一个例子
function A(a){ //普通函数 return a;}function B(b){ return function(){ //这里的函数是闭包,随B函数的调用而创建 return b; }}var x = A(10); //普通调用var y = B(20); //返回的是闭包函数,没有被调用var z = B(30); //返回的是闭包函数,没有被调用alert(x); //返回10,并且调用的堆栈被销毁alert(y()); //返回20,这里是真正调用闭包的地方,在调用B函数时,闭包函数没有随B函数的结束而
//销毁alert(z()); //返回30,这里是调用的新创建的闭包。
第二个例子
function counter(a,b){ return function(){ //这个闭包会动态修改a的值 a = a+b; return a; }
//return function(){ //这个闭包会动态修改b的值 // b = a+b; // return b; //}
}var c1 = counter(5,6); //初始值传入5,6for(var i =0;i<2;i++){ alert(c1()); //这里循环两次打印值为(第一种情况)11、17,第一次是5+6,第二次由于闭包将a
//的值改变为第一次的相加结果11,这是我们初始传入的b为6,那么就变成了11+6}alert(c1()); //23,这里又一次调用,情况与上面相同
第三个例子
function ClassA(a){ function _a(){ //私有函数,外环境不能调用 return a; } this.mes = function(){ //通过内部对象可以调用内部私有函数 return "hello "+_a(); }}var obj = new ClassA("god"); //传入字符串alert(obj.mes()); //通过产生的闭包调用函数//下面两种方法都不能够访问到_a()函数
alert(ClassA._a());
alert(obj._a());
第四个例子
function test(){ for(var i = 0;i<5;i++){ (function(j){ //闭包函数,这里改为alert(j),效果一样 setTimeout(function(){alert(j)},500); //内部又有个闭包函数,嵌套 })(i); //i为传入的形参, }
}test(); //输出 0,1,2,3,4