2011-05-20 17 views
4

我正在創建一個可用於各種網站的腳本。由於我不知道它的使用情況,所以我希望能夠將它放置在各種沙箱中,它不會影響頁面上的其他JavaScript,並且不會受到其他JavaScript的影響。創建一個獨立於其他javascript的私有名稱空間?

最基本的開始使用自調用函數:

(function(){ 
    x = function(){ alert('hi!'); 
    x(); 
})(); 

但我的問題是,如果X是已分配爲這樣的,你不能覆蓋它:

x = function(){ alert('too late!'); 
(function(){ 
    x = function(){ alert('hi!'); 
    x(); 
})(); 

這將警惕「太遲了!」而不是「嗨!」,這不是我想要的效果。誰能幫忙?

回答

5

不要忘記使用var語句,如果您不使用它,變量將在全局範圍內聲明。儘管你在正確的軌道上,在立即執行的函數中創建你自己的範圍。例如:

var x = function() { alert('foo') }; 
(function() { 
    var x = function() { alert('bar') } 
    x() // 'bar' 
}()); 
x() // 'foo' 

再回到您的示例:

x = function(){ alert('too late!')}; 
(function(){ 
    x = function(){ alert('hi!')}; 
    x(); // 'hi' 
})(); 
x(); // 'hi' 

這將提醒「喜」的兩倍,因爲沒有var聲明你是在這兩個範圍相同x價值的工作。如果您要在自執行功能中使用var語句,則第二次調用x會提示「太遲!」。

+0

謝謝主席先生!最長的時間我無法辨認出我的愚蠢。這是一個錯誤的右括號的簡單行爲!作爲以'})();'工作,'}());'結尾的自執行函數''是正確的用法!在這種情況下,添加'var'幾乎沒有什麼區別。 – smdrager 2011-05-20 00:59:04

1

在這兩種情況下,您忘記了在alert()之後添加}

看看這個小提琴:jsfiddle.net/XSebK/2/ - 它的實際工作,你希望和代碼如下所示:

x = function(){ alert('too late!'); }; 

(function(){ 
    x = function(){ alert('hi!'); } 
    x(); 
})(); 
相關問題