用处2的适用场景:你需要写一个公共模块,这个公共模块在很多地方都会使用,但是要保证公共模块中使用的变量和函数不会对其它模块造成污染,这样的话这个公共模块就需要一个单独的不同于其它模块的命名空间。
案例1:创建jQuery插件,保证创建的jQuery插件在jQuery的命名空间内都是有效的,这样每个jQuery对象才可以使用。
(function($){ $.fn.changeStyle = function(colorStr){ this.css("color",colorStr); return this; } }(jQuery));
案例2:创建一个带有私有变量和私有方法的对象。
var obj = (function(){ var privateAttr, publicAttr; function _setPriAttr(){ privateAttr = "private"; } function getPriAttr(){ return privateAttr; } return { attr:publicAttr, getAttr:function(){ getPriAttr(); } } }());
通过这种方式创建的对象,利用立即执行函数的return语句对外暴露属性以及方法,并且可以保证没有对外暴露对象的属性和方法,在对象外边是无法访问到的。
总结:其实用处1和用处2的原理都是一样的,都是利用了函数作用域的概念,请仔细体会。
参考资料: js权威指南