作用一:创建一个独立的名称空间。通俗易懂的理解,变量,函数的命名不容易跟其他包冲突。
var myfun = function() {
alert("I am global myfun");
}
var bb = "bibi";
var newHello = function(){
var myFun = function() {
alert("I am in a closured package.");
}
var bb = "cici";
return {
bb:bb,
myfun:myfun
}
}();
myfun();
alert(bb);
alert(newHello.bb);
newHello.myFun();
能体会出来吗?
作用二:做面向对象编程时,可以更好的隐藏私有实现,有利于代码维护,因为javascript中的代码,基本是靠约定私有实现或私有变量的,闭包就不一样。
var newHello1 = {
_bb:"bibi",
_myFun:function(content){
alert(content);
},
myFun:function() {
this._myFun(
"I am just to supply outer interface,"+
"for your printing service"+this._bb
);
}
}
对象中的_开头的成员代表私有,私有的概念意思是:实现者可能会改变它,但是对外接口
一般是不会改变的。想设计框架或试用框架的时候,
你要随意改动公用接口别人怎么用这框架。强悍的dojo框架就有这毛病。
这块知识,做前端开发的很多人不知道吧?
厉害的前端开发除外,如腾讯、淘宝、百度的前端开发,别人有这能力。
因此工资一般比咋们高。
闲话少扯,上面的对象定义有个问题,使用者。
不一定会按照设计者或叫提供者的意图使用该对象。
newHello1._bb = "I always want to modify your data,"+
"how can you do what to prevent from me?";
newHello1.myFun();
上面的调用系列,就会破坏对象的封装性原则,结果可能就是库设计者不想要的,
为了防止出现上面的误用。
var newHello2 = function(){
//这个变量别人不修改源码肯定该表不了
var _bb = "How can you modify me?";
var _myFun = function(content){
alert(content);
}
return {
myFun:function(){
_myFun(_bb+":This takes enhancement for data privity.");
}
}
}();
newHello2.myFun();
上面代码只能这样调用,可以保证你不想让人动的,肯定动不了。除非修改源码。
能更好的实现设计意图。