我有一些函数只返回值,如果dom中的某些底层'stuff'发生了变化,那么:
function getFoo() {
if (typeof this.prev === "undefined") {
this.prev = null;
}
// calculate x
if (x != this.prev) {
this.prev = x;
return this.prev;
} else {
return;
}
}
如果计算机var foo
没有改变, x
将返回none。从控制台调用时,这似乎工作正常。
接下来,我将它包装在一个对象中,这样我就可以顺序调用类似的函数:
function bar () {
this.plugins = {
foo: getFoo
};
for (var attr in this.plugins) {
if (this.plugins.hasOwnProperty(attr)) {
console.log(this.plugins[attr]());
}
}
奇怪的是,当我现在调用bar()
时,底层函数(例如getFoo
)总是返回值 - 即使dom中的基础内容没有改变。似乎函数在使用时被销毁(在plugin
对象中) - 我怎么能坚持这些呢?
答案 0 :(得分:1)
因此,每次调用“bar()”时,都会覆盖对象的plugins属性。在重新定义plugins属性之前,只需进行简单的检查,如下所示:
function bar () {
if (typeof this.plugins === "undefined") {
this.plugins = {
foo: getFoo
};
}
for (var attr in this.plugins) {
if (this.plugins.hasOwnProperty(attr)) {
console.log(this.plugins[attr]());
}
}
...
答案 1 :(得分:1)
好吧,当你拨打bar()
时,它会调用
this.plugin.getFoo();
因此this
内的getFoo
会引用this.plugins
。
每次拨打this.plugin
时,都会使用新对象初始化bar()
:
this.plugins = {
foo: getFoo
};
老实说,你的结构似乎很混乱。您知道this
函数中的bar()
是否指向window
对象?您正在“污染”全局命名空间。如果您直接调用getFoo
,则相同。
也许你应该有更多这样的东西:
var bar = {
plugins: {foo: getFoo},
run: function() {
for (var attr in this.plugins) {
if (this.plugins.hasOwnProperty(attr)) {
console.log(this.plugins[attr]());
}
}
}
};
你可以致电:
bar.run();
在函数调用之间使用持久和私有数据的另一种方法是使用闭包:
var getFoo = (function() {
var prev = null;
return function(x){
if (x != prev) {
prev = x;
return prev;
}
}
}());
此处,立即函数返回的函数将关闭prev
。无论您在何处分配getFoo
,它都将始终访问prev
,并且不会覆盖其他范围内的任何其他prev
变量。
我认为将x
传递给函数时也会更好。