在一本名为 Testable JavaScript 的书中,使用了以下代码模式(忽略具体内容):
var Obj = (function() {
return function() {
var docRoot = '/somewhere';
this.validateDocRoot = function(val) {
// validation logic - throw Error if not OK
};
this.setDocRoot = function(val) {
this.validateDocRoot(val);
docRoot = val;
};
this.getDocRoot = function() {
return docRoot;
};
};
}());
var myObject = new Obj();
但为什么将Obj视为一个立即调用的函数?也就是说,这种模式与以下代码模式之间的区别是什么:
var Obj = function() {
var docRoot = '/somewhere';
this.validateDocRoot = function(val) {
// validation logic - throw Error if not OK
};
this.setDocRoot = function(val) {
this.validateDocRoot(val);
docRoot = val;
};
this.getDocRoot = function() {
return docRoot;
};
};
var myObject = new Obj();
在这两种情况下,myObject
是否相同?
答案 0 :(得分:1)
你的例子没有区别。 通常立即调用的函数用于实现模块模式(http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript),它可以帮助您封装不希望在全局范围内的数据。
您的示例可以重写为
var myObject = (function() {
var docRoot = '/somewhere';
return {
validateDocRoot : function(val) {
// validation logic - throw Error if not OK
},
setDocRoot : function(val) {
this.validateDocRoot(val);
docRoot = val;
},
getDocRoot : function() {
return docRoot;
}
};
}());
在这种情况下,使用立即调用的函数确实很重要。在您的第一个示例中,它只会添加语法噪音。