如何通过闭包保存变量状态

时间:2017-04-16 20:35:11

标签: javascript node.js closures

我有一个需要多次调用的函数,这个函数会在我的html中附加元素:

class MyClass {

  somefunct(elements) {
    const father = $("#father").find("#other-element");
    for (let element of elements) {
      father.append(element);
    }
  }
}

我想避免在每次通话中初始化父亲。怎么样?

我是怎么做的:

  somefunct(elements) {
    const father = $("#father").find("#other-element");
    this.somefunc = (elements) => {
      for (let element of elements) {
        father.append(element);
      }
    }
  }

这会有效,但我不知道这是不好的做法,还是有更好的方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

最好的方法是将父声明为类的属性,并在构造函数中获取一次,如下所示:

class MyClass {
  constructor() {
    this._father = $("#father").find("#other-element");
  }

  somefunct(elements) {
    for (let element of elements) {
      this._father.append(element);
    }
  }
}

但在这种情况下,_father成员将是傀儡。如果要将其隐藏在闭包中,则必须在定义类方法时使用 IIFE (立即调用函数表达式),但由于ES类文字不允许IIFE,因此您必须使用这样的旧原型:

class MyClass {

  // ... other methods

}

MyClass.prototype.somefunct = (function() {
    const father = $("#father").find("#other-element");
    return function(elements) {
        for (let element of elements) {
            father.append(element);
        }
    }
}());

答案 1 :(得分:0)

如果您使用ES6课程。这可以这样做:

    class MyClass {

      constructor(options){
          this.$father = options.el;
      }

      somefunct(elements) {
        for (let element of elements) {
          this.$father.append(element);
        }
      }
    }

    let classInstance = new MyClass({
      el: $("#father").find("#other-element")
    });

    classInstance.somefunct(elements);