2014-06-26 56 views
0

我得到了一個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' ; 
    } 
})(); 

感謝收聽。

+1

如果您需要這樣做,可能會有更好的設計模式。你能提供實施細節或某種背景嗎? –

+0

把第一個IIFE放在第二個。 – RobG

+0

你會想要使用[模塊模式](http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript) – Bergi

回答

2

他們不能,這就是點。通過包裝這樣的代碼,它從外部不可訪問。

如果你不關心這些輔助功能保護其他的事情你可以做的是:

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

如果聲明或特定的執行上下文初始化函數,你只能從同一個訪問執行上下文或其範圍鏈上第一個執行上下文。外部環境是否是「匿名的」並不重要。例如。如下所示:

(function(){ 
    function foo() {return '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';} 

}());