Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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_Design Patterns_Oop_Closures - Fatal编程技术网

如何将外部变量传递给私有javascript外部闭包函数?

如何将外部变量传递给私有javascript外部闭包函数?,javascript,design-patterns,oop,closures,Javascript,Design Patterns,Oop,Closures,我可能在这个问题上做了一些糟糕的设计选择。我有几个对象是这样实例化的 core.modules.trial = function(sandbox){ return{ alert_private : function(){ alert(omgpi); } }; }; 我想这样做: core.modules.trial[omgpi] = "external private var"; var trial = core.modules.trial(

我可能在这个问题上做了一些糟糕的设计选择。我有几个对象是这样实例化的

core.modules.trial = function(sandbox){
  return{
    alert_private : function(){
      alert(omgpi);
    }
  };
};
我想这样做:

   core.modules.trial[omgpi] = "external private var";

    var trial = core.modules.trial();

    trial.alert_private(); //would hopefully output "external private var"
我试图将omgpi变量分配给外部函数的私有范围。通常,您会在返回任何内容之前在外部函数中执行var omgpi。但是我试图在调用此函数时从外部脚本执行此操作

这是您想要的吗

core.modules.trial = function(sandbox){
  var c = arguments.callee;
  return{
    alert_private : function(){
      alert(c.omgpi);
    }
  };
};

您可以使用monkey patch core.modules.trial:

var old_constructor = core.modules.trial;
core.modules.trial = function(sandbox) {
  this.omgpi = 'whatever'; // or an object you can add to as desired
  return old_constructor.call(this, sandbox); // rebinds to this this
};

请参阅文档。

如果需要在闭包中使用omgpi,则需要从内部进行设置。你不能在闭包中设置你不属于的东西

core.modules.trial = function(sandbox){

    ///////////////////////////
    var omgpi = this.omgpi;
    ///////////////////////////

    return{
        alert_private : function(){
            alert(omgpi);
        }
    };
};
但无论何时调用core.modules.trial(),
这个
都会引用模块,因为它与父模块类似。因此,您可以将值粘贴在如下模块中:

core.modules.omgpi = "external private var";
然后剩下的工作:

var trial = core.modules.trial();
trial.alert_private(); // alerts "external private var"
顺便说一下,您的原始代码有一个bug:

core.modules.trial[omgpi]

这使用变量omgpi的值作为键。您需要
core.modules.trial.omgpi
core.modules.trial[“omgpi”]

而不修改core.modules.trial,否则只能使用全局变量(window.omgpi)执行此操作,因为omgpi被称为外部符号。你试过了吗?这很接近我想要实现的目标,但我不需要在公共方法中预先准备好所有东西吗?另外,gpilontino是正确的,这不起作用。thx darkporter,我有很多类似的模块。我正在尝试避免重复代码。是否有任何方法可以在.modules对象或核心中自动执行此var分配?所以单个模块继承了它?我怀疑这段代码可以简化。在您的示例中,是否会使用不同的
omgpi
值多次调用
trial
?也就是说,您是否会这样做:core.modules.omgpi=“external private var”;var-trial=core.modules.trial()。。。后来。。。core.modules.omgpi=“新值”;var otherTrial=core.modules.trial();
core.modules.trial[omgpi]