真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在JavaScript中防止全局變量污染

本篇文章為大家展示了怎么在JavaScript中防止全局變量污染,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)郾城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

一. 定義全局變量命名空間

只創(chuàng)建一個全局變量,并定義該變量為當(dāng)前應(yī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標(biāo)簽引進(jìn)來,在DOM節(jié)點(diǎn)上綁定onclick等事件,看了很多人寫的代碼,也大多是這樣。

后來會發(fā)現(xiàn),當(dāng)項(xiàng)目小的時候這么做為了快速開發(fā)是可以接受的,然而當(dāng)很多人一起開發(fā)一個Javascript大應(yīng)用的時候,你會發(fā)現(xiàn)不同的代碼風(fēng)格跟全局變量會導(dǎo)致很多沖突,這是一個很痛苦的事情。

曾經(jīng)的經(jīng)歷

用過jQuery的人就知道其主要的變量符號就是$,沒錯!因此很多項(xiàng)目的開發(fā)人員也要學(xué),就自己把$定義成別的含義了,我心里對其是無敵的鄙視跟厭惡。

我曾經(jīng)拿過一個項(xiàng)目使用jQuery的,然后上頭要我使用一個已有的富文本編輯器,這樣就有兩個JS文件了

jquery.js和editor.js,于是我要開始寫該頁面的邏輯了,我發(fā)現(xiàn)editor.js里邊自定義了$符號,我原本想要把它直接替換成別的標(biāo)志符,但是悲劇的是,它還有一些插件也會用到,混亂的結(jié)構(gòu)導(dǎo)致我花了很多時間去解決這個沖突。

全局Window

我們都知道,在文件中直接定義的變量跟函數(shù)(不嵌套在任何域底下的)都是屬于全局的,也就是都在當(dāng)前頁面的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)的,因?yàn)槠淝懊鏇]有使用var關(guān)鍵字,解釋器會認(rèn)為它在test2的上一層定義的,依次查找上一層,直到找到window全局,如果發(fā)現(xiàn)還是未定義,那么將其掛在window底下成為了全局變量。

所以你直接定義的函數(shù)通通都掛到了window底下,這就是一種污染了,當(dāng)很多人定義各種變量跟函數(shù),你又得同時引入進(jìn)來的時候,這個沖突的概率就變大了。

減少污染

那為了避免過多這樣的沖突,以及模塊之間的耦合性更低,需要減少這樣的污染。

此時我們會想,那不要把變量定義在全局唄,采用類似C++的命名空間,Java的包的思路就行啦。

首先就是將不同的模塊劃入到不同的全局“包”(這里的包的概念實(shí)際上就是一個Javascript對象而已)。

例如,程序員A為全局添加一個A變量,然后他把自己定義的函數(shù)/變量全部掛到A底下,這樣就跟程序員B所定義的隔離了。

再者我們可以使用函數(shù)域來隔離一些局部變量的沖突,比如說程序員A寫的代碼如下:

JS代碼:

(function(obj){
  /* 在這里邊就與外邊隔離了,定義的局部變量不會與外界干擾 */
  /* 為了跟外界達(dá)到共享的目的,還可以為其加入?yún)?shù),例如obj,在最后調(diào)用的時候把相關(guān)的參數(shù)傳進(jìn)來,例如下邊的window */
  var A = {};//定義一個A包
  var tmp;//臨時變量
  A.i = 1;//定義這個包里邊的i變量
  A.func = function(){alert('I am A');};
  obj.A = A;/* 把A包掛到obj底下 */
})(window);

當(dāng)離開了這個函數(shù)域之后,tmp等局部變量被銷毀(只要不要存在在閉包里邊),程序員A定義的東西通通掛到了變量window.A底下,從而減少了很多污染,避免了不必要的沖突。

回到過去

再次回到剛剛提過的那個經(jīng)歷,如果我現(xiàn)在為editor.js整個包圍在function里邊,通過這種方式把$給隱藏在一個包里邊,在它的其他控件中也采取這樣的做法,當(dāng)然還要做一小點(diǎn)改動:

JS代碼:

/* editor.js */
(function(obj){
  /* 原先editor里邊的內(nèi)容 */
  /* 里邊有定義了自己的$標(biāo)志 */
  obj.editor = obj.editor || {};//如果沒有editor對象,則生成一個空對象
  obj.editor.$ = $;//把$掛在全局的editor對象上
})(window);

JS代碼:

/* 其他控件.js */
(function(obj){
  var $ = obj.$;//把$恢復(fù)
  /* 原先控件的內(nèi)容 */
})(window.editor);

JavaScript是什么

JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網(wǎng)站添加各種各樣的動態(tài)效果,讓網(wǎng)頁更加美觀。

上述內(nèi)容就是怎么在JavaScript中防止全局變量污染,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前名稱:怎么在JavaScript中防止全局變量污染
標(biāo)題URL:http://weahome.cn/article/gsspcp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部