全局變量污染什麼的最討厭了

原則

  1. 用匿名函數將腳本包起來;javascript

  2. 使用多級命名空間。java

這第二條「使用多級命名空間」這個,我以爲並非很完美的好主意。由於若是級數太多的話會形成變量名字變得長的一逼。函數

改進過程

原始代碼

沒有作過任何優化的滿目瘡痍的代碼。a.js 和 b.js 都有全局變量 window.a ,致使衝突,全局變量屬於 window 做用域下的。優化

//a.js
<script type="text/javascript">
    //都什麼時代了,script標籤還寫type屬性呢?黃牌警告!下次絕逼不寫了。
    var a = 123, b = "hello world";
</script>

//b.js
<script>
    //看!這把沒有寫了吧~就是這麼任性,上面的那個寫了的也絕逼不改!
    var a, c = "abc";
</script>

使用匿名函數

經過匿名函數改變了a.js 和 b.js 中的變量 a 的做用域,使得他們都再也不是全局變量了,可是在 b.js 中沒法訪問在 a.js 中的變量 a, 換而言之,他們之間沒辦法通訊了。code

//a.js
(function() {
    var a = 123, b = "hello world";
})();

//b.js
(function() {
    var a, c = "abc";
})();

使用全局變量進行通訊

var str;
//a.js
(function() {
    var a = 123,
    b = "hello world";
    window.str = a;
})();

//b.js
(function() {
    var a, c = "abc";
    alert(window.str);
})();

使用 window.str 這種全局全局變量做爲通訊的媒介其實並非一個好辦法,這樣作會致使全局變量愈來愈多,反而很差維護。ip

使用命名空間

var GLOBAL = {};
//a.js
(function() {
    var a = 123,
    b = "hello world";
    GLOBAL.A.a = a;
})();

//b.js
(function() {
    var a, c = "abc";
    alert(GLOBAL.A.a);
})();

使用單一的全局變量 GlOBAL ,匿名空間裏須要保存的屬性都在全局變量 GLOBAL 的基礎上使用命名空間的方式進行拓展。這裏給命名空間起名字也須要很講究,好的命名規則會對團隊協同合做有很大的幫助。具體的命名方式待我賣個關子,之後再說。作用域

相關文章
相關標籤/搜索