0

以下のコードのように、クロージャーを作成している返された関数を呼び出しても問題ありませんか?

そのため、html にアクセスするときに Bay.HTML()(); を実行する必要はありません。?

Bay.prototype.HTML = function () {
    var html;
    return function () {
        if (!html) {
            var td = docCreate('td');
            td.setAttribute('id', 'bay' + this.number);
            td.setAttribute('class', 'bay');
            html = td;
        }
        return html;
    }(); <----------HERE
};
4

4 に答える 4

1

それはあなたが何かを「大丈夫」にしたい文脈に依存します。それは機能しますか?もしそうなら、時々それが必要なすべてです。あなたのコードを読んでいる他の誰かに、それが何をするのか、それは保守可能であるのか、それは安全であるのかは明らかですか?

だから、コード。それは機能しますか?いいえ。

メソッド変数'html'は、このプロトタイプ関数が呼び出されるたびにnullに初期化されるため、内部関数の条件は常にtrueと評価され、dom要素を設定する手順を実行します。

ここでクロージャを使用する必要がありますか?いいえ。

呼び出し元のコンテキストを超えて持続しないクロージャを作成しているため、役に立たない。Bar.HTML()を呼び出すたびに、コードを実行するためだけに追加のコンテキストを作成および破棄します。これは、後で処理するクロージャー自体への参照を保存または返す必要がないためです。クロージャを除外して、パフォーマンスの高い結果を得ることができます。

Bay.prototype.HTML = function() {
    var html; 
    if(!html) {
        var td = docCreate('td');
        td.setAttribute('id', 'bay' + this.number);
        td.setAttribute('class', 'bay');
        html = td;
    }
    return html;
}

もちろん、そのhtml varがその場で宣言されているので、ifステートメントは必要ありませんが、これは単なるサンプルコードだと思います。

ここでは、javascriptのクロージャ、いつ、どのように使用するかについての優れた情報をいくつか紹介します。

于 2012-04-24T16:42:12.763 に答える
1

私はあなたが欲しかったと思います

Bay.prototype.HTML = (function () {
    var html;
    return function () {
        if (!html) {
            var td = docCreate('td');
            td.setAttribute('id', 'bay' + this.number);
            td.setAttribute('class', 'bay');
            html = td;
        }
        return html;
    };
})(); <----------HERE

これにより、が呼び出されるBay.prototype.HTMLたびに役に立たない関数を即座に実行する代わりに、クロージャーから返される関数が に割り当てられます。実際にはクロージャーを作成するわけではありません。Bay.prototype.HTML

于 2012-04-24T16:48:51.333 に答える
0

@Esailjaは正しいです。あなたの実装は、あなたが望むように結果をキャッシュしていません。

彼のソリューションはそれをキャッシュしますが、それはパブリック プロパティになります。キャッシュを公開しないキャッシング バージョンが必要な場合は、間違った関数を評価しています。あなたが望むものは:

Bay.prototype.HTML = (function() {
    var html;
    return function() {
        if(!html) {
            var td = docCreate('td');
            td.setAttribute('id', 'bay' + this.number);
            td.setAttribute('class', 'bay');
            html = td;
        }
        return html;
    };
})();
于 2012-04-24T16:46:20.643 に答える
0

それは大丈夫ですが、それは違いはありません

Bay.prototype.HTML = function () {
    var html;

    if (!html) {
        var td = docCreate('td');
        td.setAttribute('id', 'bay' + this.number);
        td.setAttribute('class', 'bay');
        html = td;
    }
    return html;
};

つまり、html がキャッシュされていません。

キャッシュしたい場合は、次のhtmlことが必要です。

Bay.prototype.HTML = function () {

    if (!this.html) {
        var td = docCreate('td');
        td.setAttribute('id', 'bay' + this.number);
        td.setAttribute('class', 'bay');
        this.html = td;
    }
    return this.html;
};
于 2012-04-24T16:37:58.967 に答える