我有:
var diagram = {
init: function(name) {
this._name = name;
},
update: function(params) {
var selector = 'diagram_name_' + this._name;
this.update = function(params) {
app.updateBlock(selector, params);
};
this.updateDiagram(params);
};
diagram.update(); // caches `selector`
diagram.update(); // uses cached `selector`
diagram
对象有方法update
。此方法使用selector
变量。第一次调用update()
时,我会缓存此变量并更改update
方法,以便下次调用它时,此方法将使用缓存的selector
。
我想知道这种方法在性能方面是否合适(如果可以的话)。有什么想法吗?
P.S。
我知道我可以在_selector
方法中创建私有字段this._selector = 'diagram_name_' + name
并执行init
,但这种方法会创建仅由一种方法使用的私有字段,感觉不对。< / p>
答案 0 :(得分:1)
更好的方法可能是在对象上缓存选择器:
this._selector || (this._selector = "value");
通过这种方式,不那么神奇,你仍然可以访问所有旧数据,而不是让它消失。
你也可能想要结账的是memoization这种技术,这种技术已被多次解决(为了避免自己必须这样做)。
答案 1 :(得分:0)
是的,没关系。它被称为Self-Defining Functions。此外,该模式还出现在很棒的书中,#14; JavaScript Patterns&#34;作者Stoyan Stefanov。
答案 2 :(得分:0)
无需担心性能,update
方法也会以预期的方式运行。从技术上讲,这种模式会起作用。
然而,我发现它相当令人困惑。当然,当涉及到代码清晰度时,事情总是有点主观,但这是我的建议:
方法1
完全分开两个案例并确保外部代码在调用updateDiagram
之前调用update
:
var diagram = {
init: function(name) {
this._name = name;
},
update: function(params) {
var selector = 'diagram_name_' + this._name;
app.updateBlock(selector, params);
},
updateDiagram: function(params) {
//...
}
};
方法2
使用参数指示应使用哪种情况:
var diagram = {
init: function(name) {
this._name = name;
this._diagramUpToDate = false;
},
update: function(params) {
if (this._diagramUpToDate) {
var selector = 'diagram_name_' + this._name;
app.updateBlock(selector, params);
} else {
this.updateDiagram(params);
}
},
updateDiagram: function(params) {
//...
this.diagramUpToDate = true;
}
};
当然,您最终会选择使用它。正如我所说,你的方法也很好,唯一的问题可能是代码清晰。