Javascript: как две самоисполняющиеся функции могут получить доступ друг к другу

Я понимаю, что такое самовыполняющаяся анонимная функция 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' ;
    }
})();

Спасибо за внимание.


person Jarrod    schedule 26.06.2014    source источник
comment
Вероятно, есть лучший шаблон проектирования, если вам нужно это сделать. Можете ли вы предоставить детали реализации или какой-то фон?   -  person Kodlee Yin    schedule 26.06.2014
comment
Поместите первый IIFE внутрь второго.   -  person RobG    schedule 26.06.2014
comment
Вы можете использовать шаблон модуля.   -  person Bergi    schedule 26.06.2014


Ответы (2)


Они не могут, и в этом суть. Обернув код таким образом, он недоступен извне.

Если вас не волнует такая защита доступности, вы можете сделать следующее:

function foo() { bar() } // call bar
foo(); // execute immediately
function bar() { // do stuff }
bar(); // also execute immediately
person Robert Levy    schedule 26.06.2014

Если вы объявляете или инициализируете функцию в определенном контексте выполнения, вы можете получить к ней доступ только из того же или другого контекста выполнения, который имеет первый в своей цепочке областей видимости. Неважно, является ли внешний контекст «анонимным» или нет. Например. В следующих:

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

foo так же недоступен, как если бы вы сделали:

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

or

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';}

}());
person RobG    schedule 26.06.2014