javascript 匿名函数实现模块作用域

其实javascript中并没有像其他强类型语言里的模块作用域.

何为模块作用域,比如C#代码中

if(true)
{
string rtnString="成功";
}else
{
string rtnString="失败";
}

return rtnString;

上面的代码在C#里编译时会报错,因为rtnString 分别在 if  和 else 分支做了定义,而外部并没有定义,所以报错,所以你可以简单的把强类型里面的 花括号 { } 理解为模块作用域.其他强类型语言大体也可以这样理解.


所以在javascript中

function showNum(count){
for(var i=0;i var m=i*2;
}
alert("i值:"+i+" m值:"+m);
}
showNum(5);


在执行上面的showNum() 函数时, 变量i 和 m 都是 for 循环里定义,但是我们在for 循环外 alert 时,不仅没有报错,而且成功拿到了值.可见javascript中花括号并不是模块作用域.这样给我们带来的麻烦比较多,当我们一个团队在开发大型项目时,不断累加的变量和方法,最后很容易出现各种冲突,维护起来简直是噩梦,所以私有变量对我们非常重要.


那么如果我想使用一个私有变量时,该如何做?  匿名函数来帮你.


首先应该明白匿名函数的生命周期: 当匿名函数执行结束时,其内部定义的任何变量都会被系统销毁.

(function outNumber(count){
(function(){
for(var i=0;i alert(i);
}
})();
})(5);


上面这个函数是一个自启动函数(运行代码马上执行)  如下:

var outNumber=function(num){ ......  }  如何运行 outNumber 函数呢,   outNumber(5)   给一个圆括号,赋值一个参数即可.上面的最外层匿名函数就是类似这样.

里面的匿名函数定义了一个私有作用域 ,功能是弹出循环里的每个值.这时在匿名函数外访问循环变量i 将会报错.

所以我们在开发中碰到定义私有变量或者私有方法的时候,尽量使用匿名函数来定义一个私有作用域.这样既好维护也不会污染全局变量等.


End!


回到顶部