JavaScript防止全局變量污染的方法總結
本文實例講述了JavaScript防止全局變量污染的方法。分享給大家供大家參考,具體如下:
javaScript 可以隨意定義保存所有應用資源的全局變量。但全局變量可以削弱程序靈活性,增大了模塊之間的耦合性。
在多人協(xié)作時,如果定義過多的全局變量 有可能造成全局變量沖突,也就是全局變量污染問題,以下是兩種解決辦法
一. 定義全局變量命名空間
只創(chuàng)建一個全局變量,并定義該變量為當前應用容器,把其他全局變量追加在該命名空間下
var MY={};
my.name={
big_name:"zhangsan",
small_name:"lisi"
};
my.work={
school_work:"study",
family_work:"we are"
};
二 . 利用匿名函數(shù)將腳本包裹起來
(function(){
var exp={};
var name="aa";
exp.method=function(){
return name;
};
window.ex=exp;
})();
前言
記得long long ago,剛剛開始寫JS的時候,我喜歡寫一些函數(shù)在JS文件里邊,然后通過script標簽引進來,在DOM節(jié)點上綁定onclick等事件,看了很多人寫的代碼,也大多是這樣。
后來會發(fā)現(xiàn),當項目小的時候這么做為了快速開發(fā)是可以接受的,然而當很多人一起開發(fā)一個Javascript大應用的時候,你會發(fā)現(xiàn)不同的代碼風格跟全局變量會導致很多沖突,這是一個很痛苦的事情。
曾經的經歷
用過jQuery的人就知道其主要的變量符號就是$,沒錯!因此很多項目的開發(fā)人員也要學,就自己把$定義成別的含義了,我心里對其是無敵的鄙視跟厭惡。
我曾經拿過一個項目使用jQuery的,然后上頭要我使用一個已有的富文本編輯器,這樣就有兩個JS文件了
jquery.js和editor.js,于是我要開始寫該頁面的邏輯了,我發(fā)現(xiàn)editor.js里邊自定義了$符號,我原本想要把它直接替換成別的標志符,但是悲劇的是,它還有一些插件也會用到,混亂的結構導致我花了很多時間去解決這個沖突。
全局Window
我們都知道,在文件中直接定義的變量跟函數(shù)(不嵌套在任何域底下的)都是屬于全局的,也就是都在當前頁面的window變量底下。例如:
JS代碼
function test1(){
}
var name;
function test2(){
i = 1;
}
上邊代碼中的name,test1,test2和i都是屬于window底下的全局變量,也就是可以通過以下三種辦法訪問到它們:
1.直接訪問name,test1()等;
2.使用window["name"], window['test1']()等;
3.使用window.name,window.test1()等。
注意:上邊代碼中的i雖然是在test2函數(shù)里邊才出現(xiàn)的,因為其前面沒有使用var關鍵字,解釋器會認為它在test2的上一層定義的,依次查找上一層,直到找到window全局,如果發(fā)現(xiàn)還是未定義,那么將其掛在window底下成為了全局變量。
所以你直接定義的函數(shù)通通都掛到了window底下,這就是一種污染了,當很多人定義各種變量跟函數(shù),你又得同時引入進來的時候,這個沖突的概率就變大了。
減少污染
那為了避免過多這樣的沖突,以及模塊之間的耦合性更低,需要減少這樣的污染。
此時我們會想,那不要把變量定義在全局唄,采用類似C++的命名空間,Java的包的思路就行啦。
首先就是將不同的模塊劃入到不同的全局“包”(這里的包的概念實際上就是一個Javascript對象而已)。
例如,程序員A為全局添加一個A變量,然后他把自己定義的函數(shù)/變量全部掛到A底下,這樣就跟程序員B所定義的隔離了。
再者我們可以使用函數(shù)域來隔離一些局部變量的沖突,比如說程序員A寫的代碼如下:
JS代碼:
(function(obj){
/* 在這里邊就與外邊隔離了,定義的局部變量不會與外界干擾 */
/* 為了跟外界達到共享的目的,還可以為其加入參數(shù),例如obj,在最后調用的時候把相關的參數(shù)傳進來,例如下邊的window */
var A = {};//定義一個A包
var tmp;//臨時變量
A.i = 1;//定義這個包里邊的i變量
A.func = function(){alert('I am A');};
obj.A = A;/* 把A包掛到obj底下 */
})(window);
當離開了這個函數(shù)域之后,tmp等局部變量被銷毀(只要不要存在在閉包里邊),程序員A定義的東西通通掛到了變量window.A底下,從而減少了很多污染,避免了不必要的沖突。
回到過去
再次回到剛剛提過的那個經歷,如果我現(xiàn)在為editor.js整個包圍在function里邊,通過這種方式把$給隱藏在一個包里邊,在它的其他控件中也采取這樣的做法,當然還要做一小點改動:
JS代碼:
/* editor.js */
(function(obj){
/* 原先editor里邊的內容 */
/* 里邊有定義了自己的$標志 */
obj.editor = obj.editor || {};//如果沒有editor對象,則生成一個空對象
obj.editor.$ = $;//把$掛在全局的editor對象上
})(window);
JS代碼:
/* 其他控件.js */
(function(obj){
var $ = obj.$;//把$恢復
/* 原先控件的內容 */
})(window.editor);
當然咯,如果editor.js有些功能需要暴露到全局的話,還需要將其進一步的掛在editor變量底下,這里只是一個示范。
本篇總結
很多框架都采用了這種做法減少全局污染,可能很多人一開始對這種做法有疑惑,這里只是個人理解拿出來分享一下,繼續(xù)歡迎交流。
更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章
JavaScript中的Reflect對象詳解(ES6新特性)
這篇文章主要介紹了JavaScript中的Reflect對象(ES6新特性)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
VSCode Webview中實現(xiàn)點擊下載圖片的基本流程
這篇文章主要介紹了VSCode Webview中如何實現(xiàn)點擊下載圖片,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
驗證用戶是否修改過頁面的數(shù)據(jù)的實現(xiàn)方法
在實現(xiàn)程序的修改模塊時,要在頁面端檢查用戶是否修改過數(shù)據(jù),以便提醒用戶及時保存修改后的數(shù)據(jù)。2008-09-09
TypeScript在Vuex4中使用TS實戰(zhàn)分享
這篇文章主要介紹了TypeScript在Vuex4中使用TS實戰(zhàn)分享,vuex4類型?Api分析和vuex4實戰(zhàn)兩部分講述,需要的小伙伴可以參考一下2022-06-06
ListBox實現(xiàn)上移,下移,左移,右移的簡單實例
這篇文章主要介紹了ListBox實現(xiàn)上移,下移,左移,右移的簡單實例。需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02

