以下代码是函数库的框架:
var anObject() {
var private = function() {
if(typeof oneTimeVar === 'undefined') {
oneTimeVar = // code to define oneTimeVar
}
}();
var public = function() {
return //value using oneTimeVar
};
this.public=public;
}
//instantiated:
var foo = new anObject();
变量 oneTimeVar 只应在 anObject 的每个实例化时确定一次,并按预期行为作为对象的私有成员。但是,它没有明确声明为变量,这让我有点怀疑。是否有其他语法适用于应该使用的这种情况?
答案 0 :(得分:0)
您的代码isn't doing what you think it does,使用IIFE声明private
变量或测试是否存在值是没有意义的。
只需使用
function AnObject() {
// replace with time-consuming code
alert('running the code block');
var oneTimeVar = 17; // private scope
// ^^^
function public() {
return oneTimeVar*2;
}
this.public = public; // making the method public
}
// instantiation:
var foo = new AnObject();
console.log(foo.oneTimeVar); // undefined
console.log(foo.public()); // 34
答案 1 :(得分:0)
此版本似乎表现出理想的行为,同时避免污染全局命名空间:
function my2Obj(hasRun) {
if(!hasRun) {
alert('running a potentially time-consuming code block only one time')
var oneTimeVar = 17; // private scope
};
var publicFn = function() {
return oneTimeVar*3;
};
this.publicFn = publicFn;
}
var foo= new my2Obj(0);
x = foo.publicFn(); alert(x);
// undefined- undefined- error
console.log(window.oneTimeVar + ' ' + foo.oneTimeVar + ' ' +oneTimeVar);
hasRun
标志仅允许在实例化时计算oneTimeVar
,同时允许它保留在私有范围内。如果要在函数开始时声明此变量,则每次都会运行定义其值的代码块。在这个骨架代码中,该变量是一个平凡的代理,用于计算出相当长的数组,需要非常重要的计算时间,这是对象的其他方法所必需的。对象本身将是一个函数库(例如,publicFn()
),因此实例化以提供对其方法的访问只会发生一次。
感谢发人深省的评论和教育参考