在Javascript中关闭静态值

时间:2013-09-02 20:54:45

标签: javascript closures

我有一个问题。我们都知道Javascript中闭包的强大功能,我想用这个功能。假设我有一个名为“BRB”的对象。我想要的是,每当用户第一次调用方法getBrowser()时,它会发现浏览器版本/名称并将其返回并将其作为静态存储在其自身内部,当getBrowser()第二次调用时它应该返回相同的没有计算的值,因为它已经静态存储在某个地方。这可以通过许多不同的方式完成,我们可以只在对象中存储一个属性,在第一次调用中我们可以为它设置一些值并在以后使用它,我们可以在语法中创建对象时直接运行getBrowser方法< / p>

(function()(
...
))()

但是,这不是我想要的。我想要的只是getBrowser()方法只计算一次值并一直使用它,我不想将值存储在其他地方的对象中,我不想在创建对象时立即运行此方法,我' m只允许使用,只允许使用此方法,所有操作都必须在这一方法中进行。我在这里举了一个例子,因为你看它会一直打印出“0”,但我想要的是它为每个console.log请求打印0,1,2,3。我希望我清楚自己。感谢。

(
function(window){

    if(window.BRB) return;

    var BRB = function(){}
    BRB.prototype.getBrowser = function(){
        var browser = null;
        return function(){
            if(browser === null){
                browser = 0;
            }
            return browser++;
        }
    }

    window.BRB = new BRB();
})(window);

console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());

3 个答案:

答案 0 :(得分:1)

您应该在其他地方定义浏览器变量:

(
function(window){

    if(window.BRB) return;

    var browser = null;
    var BRB = function(){}
    BRB.prototype.getBrowser = function(){
        if(browser === null){
            browser = 0;
        }
        return browser++;
    }

    window.BRB = new BRB();
})(window);

console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());

jsfiddle http://jsfiddle.net/5ByYR/1/

如果你能够为getBrowser分配一个对象而不是函数:

(
function(window){

    if(window.BRB) return;

    var BRB = function(){}
    BRB.prototype.getBrowser = {
        browser: null,
        get: function() {
            if(this.browser === null){
                this.browser = 0;
            }
            return this.browser++;
        }
    }

    window.BRB = new BRB();
})(window);

console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());

答案 1 :(得分:1)

您可能希望getBrowser方法成为结果的IIFE闭包:

BRB.prototype.getBrowser = (function(){
    var browser = null;
    return function(){
        if(browser === null){
            browser = 0;
        }
        return browser++;
    }
})();

这样,browser变量不会在每次函数调用时重新初始化。

<强>更新
您可以使用属性而不是闭包中的变量作为浏览器值:

BRB.prototype.getBrowser = function() {
    if(!this.browser){
        this.browser = 0;
    }
    return this.browser++;
}

答案 2 :(得分:1)

您的要求有点奇怪。这是你正在寻找的吗?它的工作原理是在getBrowser函数本身上创建一个属性:

(function(window){

    if(window.BRB) return;

    var BRB = function(){}
    BRB.prototype.getBrowser = function(){
        if(typeof this.getBrowser.browser == "undefined"){
            return this.getBrowser.browser = 0;
        } else {
            return ++this.getBrowser.browser;
        }
    }

    window.BRB = new BRB();
})(window);

console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());

http://jsfiddle.net/5DheZ/