2013-03-28 71 views
0
(function($) { 

    var foo = (function(){ 

     //some functions 

    })(); 

    // I can access foo here 
    var f = new foo(); 

})(jQuery); 

// But obviously not here since it's in another scope 

如何退還foo到窗口範圍,使之能外IIFE的外部訪問?我試過return foo;但它沒有工作。從另一個函數返回一個自我執行的函數(IIFE)

回答

3

只需將它作爲一個窗口屬性:

(function($) { 

    var foo = (function() { 

     // some functions 

    })(); 

    window.foo = foo; 
// ^^^^^^^^^^^^^^^^^ 

})(jQuery); 

foo(); 

但是,設置全局對象爲window對象的屬性,通常看不起。也許你可以通過管理你自己定製的「全局」對象來模擬這種能力。例如:

var global = {}; 

(function($) { 

    global.foo = (function() { 

     // define 

    })(); 

})(jQuery); 

global.foo(); 

這樣,處理各種範圍和對象時不會出現名稱衝突。

+0

謝謝,不知道爲什麼我沒有想到:) – Johan

+0

關於你的第二個代碼片段;它仍然意味着我得到window.global.foo,對吧?沒什麼區別,imo。 – Johan

+0

@Johan不,你只會被視爲'全球'。如果我沒有定義'var'關鍵字,它就會成爲窗口對象上的一個全局變量。不過在這種情況下。 – 0x499602D2

1

使用全局屬性是意大利麪條代碼的快車票。您的整個應用程序應儘可能少地放置在全局對象中,理想情況下只有一個。

從長遠來看,這更優雅更安全。

var MYAPP = {}; //declaring with var is not necessary here, but it's good to keep constant. 

MYAPP = (function($, MYAPP) { 

    var foo = (function(){ 

     //some functions 

    })(); 

    // enrich your object 
    MYAPP.foo = foo; 
    return MYAPP; 

})(jQuery, MYAPP); 

然後你可以使用你的「豐富的」MYAPP對象。

MAYPP.foo(); 

JavaScript的上帝建議類似於這種模式:Douglas Crockford。

+0

感謝您的評論。就我而言,我知道它只是窗口對象上的一個屬性。它真的很重要,如果它的'MYAPP'或'foo'?我的意思是,不管怎樣,它至少會有一個屬性附加到'window',對吧? – Johan

+0

至少必須有一個'window'屬性。如果你只需要那個,當然這不是問題,但是在編程這些小「我只做一次」時,隨着程序的增長,總是會回到你的身邊,並將你踢進球=)。即使你只需要foo,我也會在全局中聲明'var foo;'並且從自動執行函數的返回中分配它。這樣,即使您的程序長度爲5k行,您也會知道它來自哪裏。不要讓奇怪的依賴,保持乾淨。 – bgusach

+0

我完全同意,感謝您的輸入! – Johan

相關問題