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