0

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

(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()());
4

3 回答 3

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());
于 2013-09-02T20:59:16.017 回答
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/

于 2013-09-02T21:14:10.167 回答
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++;
}
于 2013-09-02T21:02:31.470 回答