关闭javascript调用

时间:2012-04-24 16:21:21

标签: javascript closures

是否可以调用正在创建闭包的返回函数,如下面的代码中所示?

这样当获得访问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 个答案:

答案 0 :(得分:2)

我猜你想要

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时立即执行无用的函数 - 而不是真正创建闭包。

答案 1 :(得分:1)

没关系,但

并没有什么不同
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;
};

答案 2 :(得分: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语句不是必需的,但我认为这只是一些示例代码。

以下是关于closures in javascript的一些重要信息,何时以及如何使用它们。

答案 3 :(得分: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;
    };
})();