持久化javascript函数在一个对象中

时间:2011-05-05 15:07:17

标签: javascript

我有一些函数只返回值,如果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对象中) - 我怎么能坚持这些呢?

2 个答案:

答案 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传递给函数时也会更好。