Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将函数放在另一个作用域中?_Javascript_Scope_Instance Variables - Fatal编程技术网

Javascript 将函数放在另一个作用域中?

Javascript 将函数放在另一个作用域中?,javascript,scope,instance-variables,Javascript,Scope,Instance Variables,我有一个(非常)简化的类,如下所示: var myClass = (function( window ) { function myClass(configObject) { var instanceVar = 'something that is different for every instance of myClass'; configObject.action && configObject.action(); } return myClas

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

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);
现在,当我传递option config对象时(它可能包含理论上无限数量的函数,这些函数反过来引用该类中的变量,而这些变量对于该类的每个实例都是不同的)

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

bind
出现在我的脑海中,但它只改变了
这个
上下文,而不是范围。我可以将变量作为参数传递给函数,但是每个函数都必须检查内部的参数,并且关于来自外部配置对象的函数的数量(可能超出我的控制),我希望避免将其作为一个先决条件

有没有办法将函数“克隆”到类作用域或类似的地方?闭包在任何方面都有帮助吗(如果有,请举例说明,因为我还没有完全考虑闭包)


谢谢

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

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

var myClass=(函数(窗口){
函数myClass(configObject){
var instanceVar='对于myClass的每个实例都是不同的';
var configInstance=Object.create(configObject,{//创建一个从原始configObject继承的新configInstance,这意味着不会更改原始configInstance
实例变量:{
可写:false,
可配置:false,
值:instanceVar
}//将instanceVar作为成员添加到configInstance
});
configInstance.action&&configInstance.action();
}
返回myClass;
})(窗口);
变量配置={
“动作”:函数(){
console.log(this.instanceVar);
}
};
var实例=新的myClass(配置)这是我的版本

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小提琴手:

谢谢!如果没有其他方法,我将不得不将这个.*和init函数添加到所有已经存在的配置对象中。。。也许其他人有另一种方法-我会在标记您的答案之前稍等片刻。我也考虑过这一点,但是,我必须将所有实例变量作为参数传递,并将其反映在每个配置函数的参数列表中(数量可能会随时间而变化,谁知道呢,因此我必须更改所有配置文件)。
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); 
  }
});