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!