【问题标题】:Put function in another scope?将功能放在另一个范围内?
【发布时间】:2015-11-29 00:57:15
【问题描述】:

我有一个(非常)简化的类,如下所示:

var myClass = (function( window ) {
  function myClass(configObject) {
    var instanceVar = 'something that is different for every instance of myClass';
    configObject.action && configObject.action();
  }
  return myClass;
})(window);

现在,当我传递选项配置对象时(理论上可能包含无限数量的函数,这些函数又引用来自类的变量,对于该类的每个实例都不同)...

var config = {
  "action": function() {
    concole.log(instanceVar); // is undefined when called from myClass, because it's in another scope
  }
};

var instance = new myClass(config);

...当然,这些变量在函数范围内是不可访问的。如何将配置中的功能放入类范围?

bind我想到了,但它只改变了thiscontext,而不是范围。我可以将变量作为参数传递给函数,但是每个函数都必须在内部检查该参数,并且关于来自外部配置对象的函数数量可能超出我的控制,我想避免将此作为先决条件。

有没有办法将函数“克隆”到类范围或类似的范围内?闭包是否有任何帮助(如果有,请举例说明,因为我还没有完全理解闭包)。

谢谢!

【问题讨论】:

    标签: javascript scope instance-variables


    【解决方案1】:

    这是我的版本

    var myClass = (function( global ) {
      function myClass(configObject) {
        var instanceVar = 'something that is different for every instance of myClass';
        configObject.action && configObject.action(instanceVar);
      }
      return myClass;
    })(window);
    
    var instance = myClass({
      "action": function(instanceVar) {
        console.log(instanceVar); 
      }
    });
    

    js 小提琴:https://jsfiddle.net/e0pgs4vw/

    【讨论】:

    • 我也想过这一点,但是,我必须将所有实例变量作为参数传递并反映在每个配置函数的参数列表中(数量可能会随着时间而变化,谁知道呢,所以我必须更改所有配置文件)。
    【解决方案2】:

    instanceVar 是在闭包内定义的,因此除非显式传递,否则您无法从外部访问它。

    为了避免将它传递给每个方法,您可以从 configObject 创建一个新的 configInstance,并将 instanceVar 作为属性添加到新实例:

    var myClass = (function(window) {
      function myClass(configObject) {
        var instanceVar = 'something that is different for every instance of myClass';
    
        var configInstance = Object.create(configObject, { // create a new configInstance that inherits from the origin configObject, which means that the original won't be changed
          instanceVar: {
            writable: false,
            configurable: false,
            value: instanceVar
          } // add instanceVar as a member to configInstance 
        });
    
        configInstance.action && configInstance.action();
      }
      return myClass;
    })(window);
    
    var config = {
      "action": function() {
        console.log(this.instanceVar);
      }
    };
    
    var instance = new myClass(config);

    【讨论】:

    • 谢谢!如果没有其他方法,我将不得不将 this.* 和 init 函数添加到所有已经存在的配置对象中......也许其他人有另一种方法 - 在标记你的答案之前我会稍等片刻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多