【问题标题】:Javascript: How can two self executing function access each otherJavascript:两个自执行函数如何相互访问
【发布时间】:2014-06-26 00:09:10
【问题描述】:

我知道什么是 Javascript 自执行匿名函数:

(function(){
    console.log('Hello World!');
})();

我知道你可以传入参数:

(function(window){
   window.location(...);
})(window);

但是如果我有两个自执行匿名函数,每个都可以访问另一个吗?具体来说,第一个函数如何从第二个函数调用一个方法,并传递一个变量?

(function(){
    function foo () {
        return 'foo';
    }

    // How can I call "bar('my name is')"
})();

(function(){
    function bar (str) {
        return str + ' bar' ;
    }
})();

感谢收听。

【问题讨论】:

  • 如果您需要这样做,可能有更好的设计模式。你能提供实现细节或某种背景吗?
  • 把第一个 IIFE 放在第二个里面。
  • 你会想要使用module pattern

标签: javascript design-patterns anonymous-function


【解决方案1】:

他们不能,这就是重点。通过这样包装代码,外部无法访问。

如果您不关心此类可访问性保护,您可以做的其他事情是:

function foo() { bar() } // call bar
foo(); // execute immediately
function bar() { // do stuff }
bar(); // also execute immediately

【讨论】:

    【解决方案2】:

    如果您在特定执行上下文中声明或初始化函数,则只能从同一执行上下文或在其作用域链上具有第一个执行上下文的另一个执行上下文中访问它。外部上下文是否“匿名”并不重要。例如。如下:

    (function(){
        function foo () {return 'foo';}
    })();
    

    foo 就像你已经完成一样无法访问:

    (function(){
        var foo = function () {return 'foo';};
    })();
    

    function bar(){
        function foo () {return 'foo';}
    }
    bar();
    

    在这种情况下,可以使用闭包:

    var foo = (function(){
        var /* variables to hold in a closure */
    
        function foo () {return 'foo';}
    
        // Return a reference to foo
        // foo has a closure to this execution context
        return foo;
    })();
    
    (function() {
      // call foo here and pass parameters
      foo(...);
    }());
    

    您也可以将 IIFE 设置为:

    var foo = (function(){
        var /* variables to hold in a closure */
    
        // Return a reference to a function
        // that has a closure to this execution context
        return function () {return 'foo';}
    
    }());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多