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

没关系,但它没有任何不同

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 回答
0

@Esailija 是对的。您的实现没有像您想要的那样缓存结果。

他的解决方案将缓存它,但它将是公共财产。如果您想要一个不公开缓存的缓存版本,那么您正在评估错误的功能。你想要的是:

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 回答