动态改变功能可以吗?

时间:2015-04-20 22:28:43

标签: javascript function dynamic

我有:

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>

3 个答案:

答案 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;
    }
};

当然,您最终会选择使用它。正如我所说,你的方法也很好,唯一的问题可能是代码清晰。