0

質問があります。私たちは皆、Javascript のクロージャーの力を知っており、私はこの力を使いたいと思っています。「BRB」という名前のオブジェクトがあるとします。私が望んでいたのは、ユーザーがメソッド getBrowser() を初めて呼び出すときはいつでも、ブラウザーのバージョン/名前を見つけてそれを返し、getBrowser() が 2 回目に呼び出されたときに同じものを返す必要があるときに静的として内部に格納することです。すでにどこかに静的に保存されているため、計算なしで値を取得します。これはさまざまな方法で実行できます。オブジェクトにプロパティを格納するだけで、最初の呼び出しで値を設定して後で使用できます。次の構文でオブジェクトが作成されたときに getBrowser メソッドを直接実行できます。

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

しかし、これは私が望むものではありません。私が望むのは、値を一度だけ計算して常に使用する getBrowser() メソッドだけです。オブジェクト内の値を別の場所に保存したくなく、オブジェクトが作成されたときにこのメソッドをすぐに実行したくありません。 m はこのメソッドのみを使用することが許可されており、すべてのアクションはこの 1 つのメソッドで実行する必要があります。ここに例を示します。ご覧のとおり、常に「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

あなたの要件はちょっと奇妙です。これはあなたが探しているものですか?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 に答える