是否可以调用正在创建闭包的返回函数,如下面的代码中所示?
这样当获得访问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
};
答案 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;
};
})();