明确声明一次性变量

时间:2017-04-04 21:37:31

标签: javascript

以下代码是函数库的框架:

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 的每个实例化时确定一次,并按预期行为作为对象的私有成员。但是,它没有明确声明为变量,这让我有点怀疑。是否有其他语法适用于应该使用的这种情况?

2 个答案:

答案 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()),因此实例化以提供对其方法的访问只会发生一次。
感谢发人深省的评论和教育参考