2011-10-11 90 views
2

,我有以下的代碼我的網頁上:外部JavaScript文件應該如何避免全局變量和方法?

<script src="/Assets/JavaScripts/myJavaScript.js" type="text/javascript"></script> 

<script type="text/javascript"> 

    testAlert(); 

</script> 

而在myJavaScript.js我有以下幾點:

(function() { 
    function testAlert() { 
      alert('test alert'); 
    } 
})(); 

這不叫testAlert。不知道我在這裏做錯了什麼?我試圖避免全局變量和方法。我在jQuery中做了一些類似的工作,它在外部文件的開頭只需要$。有人可以請解釋我在這裏做錯了什麼,以及如何確保我遵循最佳做法?

回答

2

我把你的代碼放在我的環境中,並檢查,我在mozila錯誤控制檯中出錯。 所以,請檢查它。 你只能在myjavascript.js文件中放置下面的javascript函數。

function testAlert() { 
    alert('test alert'); 
} 
+0

給我評論,如果它可以幫助你... – sikender

+0

謝謝,但是什麼是(function(){})();部分? –

+0

@Brendan:基本上,它創建一個函數並立即運行它。在你的情況下,對於jQuery插件(通常寫成'(function($){......})(jQuery)';',它(1)非常確定jQuery可用作爲'$'(即使它處於無衝突模式,這使'$'不再意味着'jQuery'),並且(2)創建了一個空間,您可以在其中關閉私有全局內容。 – cHao

1

你在js文件中的函數沒有返回任何東西。爲了避免全局變量,你可以創建一個全局命名空間(類似的)變量:

var myNS = (function() { 
    function testAlert() { 
      alert('test alert'); 
    } 
    return {testAlert:testAlert}; 
}()); 

現在你可以在你的內聯JavaScript中使用myNS.testalert()

0

JS是以這樣一種方式製作的,你真的不能完全避免全局性。 (好吧,你可以,有點兒,如果你從不給​​出任何名字,但是這往往會導致更多的問題,而不是解決的問題。)當你從其他腳本中調用testAlert時,假設testAlert是全局的。如果不是這樣,你不能只從這樣的地方打電話。

您可以通過添加你的東西到一個對象,作爲一個命名空間,像這樣最大限度地減少碰撞的機會,不過,:

// don't clear it out if it already exists. 
// that way all of your scripts can use your namespace, if you want. 
// what you're really trying to protect against, are strangers picking names 
// like yours. 
if (!window.myNamespace) myNamespace = {}; 

// example function 
myNamespace.testAlert = function() { alert("test alert"); }; 


myNamespace.testAlert(); 

這樣,有相互衝突的一個很好的機會,唯一的名稱是myNamespace

我打算展示名稱空間全局的例子...但你知道什麼嗎?名稱空間全局是,仍然是全局的。全局變量是你想在大多數情況下嘗試並擺脫的東西。

0

您需要一些類型的全局變量,以便您可以訪問您正在查找的方法。事實上,您有<script>testAlert()</script>意味着您期望在全局名稱空間中定義testAlert()

我喜歡做什麼(特別是在使用YUI時,你已經標記了這個問題),就是創建一個充當實用類的全局對象。

var page = { 
    init: function() { 
     // Do some initialization... 
    }, 
    testAlert: function() { 
     alert("Test Alert"); 
    } 
}; 

當你這樣做後,你可以使用單一的全局「頁面」變量來訪問你需要的一切。

// e.g. 
page.testAlert(); 

// or... 
Y.on("domready", page.init, page); 

再次,對於第二個例子,我假設你使用YUI,因爲你用它標記了這個問題。