欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實(shí)例講解避免javascript沖突的方法

 更新時(shí)間:2016年01月03日 12:56:21   作者:小火柴的藍(lán)色理想  
這篇文章主要以實(shí)例的方式講解了避免javascript沖突的方法,具有一定的參考價(jià)值,感興趣的朋友可以參考一下

本文實(shí)例講解了如何避免javascript中沖突的方法,需要的朋友可以了解一下

[1]工程師甲編寫功能A

var a = 1;
var b = 2;
alert(a+b);//3

[2]工程師乙添加新功能B

var a = 2;
var b = 1;
alert(a-b);//1

[3]上一步中,工程師乙在不知情的情況下,定義了同名變量a,產(chǎn)生沖突。于是使用匿名函數(shù)將腳本包起來,讓變量作用域控制在匿名函數(shù)之內(nèi)。

//功能A
(function(){
  var a = 1;
  var b = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  var a = 2;
  var b = 1;
  alert(a-b);//1
})();


[4]此時(shí)有了新需求,網(wǎng)頁中加入功能C,且需要用到功能A中的變量b。于是在window作用域下定義一個(gè)全局變量,把它作為一個(gè)橋梁,完成各匿名函數(shù)之間的通信

//全局變量
var str;
//功能A
(function(){
  var a = 1;
  //將b的值賦給str
  var b = str = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  var a = 2;
  var b = 1;
  alert(a-b);//1
})();
//功能C
(function(){
  //將str的值賦給b
  var b = str;
  alert(b);//2
})();

[5]但如果功能C還需要功能A中的變量a呢,這時(shí)就需要再定義一個(gè)全局變量

//全局變量
var str,str1;
//功能A
(function(){
  //將a的值賦給str1
  var a = str1 = 1;
  //將b的值賦給str
  var b = str = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  var a = 2;
  var b = 1;
  alert(a-b);//1
})();
//功能C
(function(){
  //將str1的值賦給a
  var a = str1;
  //將str的值賦給b
  var b = str;
  alert(a*b);//2
})(); 

[6]但隨著匿名函數(shù)之間需要通信的變量越多,需要的全局變量也就越多。因此需要嚴(yán)格控制全局變量的數(shù)量,使用hash對象作為全局變量,可以將需要的變量都作為對象的屬性,可以保證全局變量的個(gè)數(shù)足夠少,同時(shí)拓展性非常好

//全局變量
var GLOBAL = {};
//功能A
(function(){
  //將a的值賦給GLOBAL.str1
  var a = GLOBAL.str1 = 1;
  //將b的值賦給GLOBAL.str
  var b = GLOBAL.str = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  var a = 2;
  var b = 1;
  alert(a-b);//1
})();
//功能C
(function(){
  //將GLOBAL.str1的值賦給a
  var a = GLOBAL.str1;
  //將GLOBAL.str的值賦給b
  var b = GLOBAL.str;
  alert(a*b);//2
})();

[7]但如果新增功能D,功能D需要和功能B通信,并使用功能B腳本中的變量a,開發(fā)功能D的是工程師丁

//全局變量
var GLOBAL = {};
//功能A
(function(){
  //將a的值賦給GLOBAL.str1
  var a = GLOBAL.str1 = 1;
  //將b的值賦給GLOBAL.str
  var b = GLOBAL.str = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  //將a的值賦給GLOBAL.str1
  var a = GLOBAL.str1 = 2;
  var b = 1;
  alert(a-b);//1
})();
//功能C
(function(){
  //將GLOBAL.str1的值賦給a
  var a = GLOBAL.str1;
  //將GLOBAL.str的值賦給b
  var b = GLOBAL.str;
  alert(a*b);//2
})();
//功能D
(function(){
  //將GLOBAL.str1的值賦給a
  var a = GLOBAL.str1;
  alert(a*2);//4
})(); 

[8]由于工程師丁只關(guān)心自己的匿名函數(shù)和功能B的匿名函數(shù),使用GLOBAL.str卻無意中覆蓋了功能A中設(shè)置的同名變量,導(dǎo)致功能C出錯(cuò)。于是使用命名空間來解決這個(gè)問題,在不同的匿名函數(shù)下,根據(jù)功能聲明一個(gè)不同的命名空間,然后每個(gè)匿名函數(shù)中的GLOBAL對象的屬性都不要直接掛在GLOBAL對象上,而是掛在此匿名函數(shù)的命名空間下

//全局變量
var GLOBAL = {};
//功能A
(function(){
  GLOBAL.A = {};
  //將a的值賦給GLOBAL.A.str1
  var a = GLOBAL.A.str1 = 1;
  //將b的值賦給GLOBAL.A.str
  var b = GLOBAL.A.str = 2;
  alert(a+b);//3
})();
//功能B
(function(){
  GLOBAL.B = {};
  //將a的值賦給GLOBAL.B.str1
  var a = GLOBAL.B.str1 = 2;
  var b = 1;
  alert(a-b);//1
})();
//功能C
(function(){
  //將GLOBAL.A.str1的值賦給a
  var a = GLOBAL.A.str1;
  //將GLOBAL.A.str的值賦給b
  var b = GLOBAL.A.str;
  alert(a*b);//2
})();
//功能D
(function(){
  //將GLOBAL.B.str1的值賦給a
  var a = GLOBAL.B.str1;
  alert(a*2);//4
})(); 

[9]如果同一個(gè)匿名函數(shù)中的程序非常復(fù)雜,變量名很多,命名空間還可以進(jìn)一步拓展,生成二級命名空間

//以功能A為例
(function(){
  var a = 1, b = 2;
  GLOBAL.A = {};
  GLOBAL.A.CAT = {};
  GLOBAL.A.DOG = {};
  GLOBAL.A.CAT.name = 'mimi';
  GLOBAL.A.DOG.name = 'xiaobai';
  GLOBAL.A.CAT.move = function(){};
  GLOBAL.A.str1 = a;
  GLOBAL.B.str = b;  
})();


[10]因?yàn)樯擅臻g是個(gè)非常常用的功能,進(jìn)一步將生成命名空間的功能定義成一個(gè)函數(shù),方便調(diào)用,完整版本改寫后的代碼如下

var GLOBAL = {};
GLOBAL.namespace = function(str){
  var arr = str.split('.');
  var o = GLOBAL;
  var start = 0;
  if(arr[0] == 'GLOBAL'){
    start = 1;
  }else{
    start = 0;
  }
  for(var i = start; i < arr.length; i++){
    o[arr[i]] = o[arr[i]] || {};
    o = o[arr[i]];
  }
};
//功能A
(function(){
  var a = 1;
  var b = 2;
  GLOBAL.namespace('A.CAT');
  GLOBAL.namespace('A.DOG');
  GLOBAL.A.CAT.name = 'mimi';
  GLOBAL.A.DOG.name = 'xiaobai';
  GLOBAL.A.CAT.move = function(){};
  GLOBAL.A.str1 = a;
  GLOBAL.A.str = b;  
  alert(a+b);//3
})();
//功能B
(function(){
  var a = 2;
  var b = 1;
  GLOBAL.namespace('B');
  GLOBAL.B.str1 = a;
  alert(a-b);//1
})();
//功能C
(function(){
  var a = GLOBAL.A.str1;
  var b = GLOBAL.A.str;
  alert(a*b);//2
})();
//功能D
(function(){
  var a = GLOBAL.B.str1;
  alert(a*2);//4
})();


[11]代碼的沖突問題已經(jīng)解決了,但可維護(hù)性并不強(qiáng)。比如,現(xiàn)在需要讓工程師甲去修改功能B。因?yàn)楣こ處熂讓懙哪_本是關(guān)于功能A的,他并不知道功能B的腳本情況。為了改善這種局面,需要給代碼添加適當(dāng)?shù)淖⑨尅?/p>

var GLOBAL = {};
GLOBAL.namespace = function(str){
  var arr = str.split('.');
  var o = GLOBAL;
  var start = 0;
  if(arr[0] == 'GLOBAL'){
    start = 1;
  }else{
    start = 0;
  }
  for(var i = start; i < arr.length; i++){
    o[arr[i]] = o[arr[i]] || {};
    o = o[arr[i]];
  }
};
/*
* @method 功能A:實(shí)現(xiàn)加法運(yùn)算
* @author 工程師甲
* @connect 1234567
* @time 2015-01-01
*/

(function(){
  var a = 1;
  var b = 2;
  GLOBAL.namespace('A.CAT');
  GLOBAL.namespace('A.DOG');
  GLOBAL.A.CAT.name = 'mimi';
  GLOBAL.A.DOG.name = 'xiaobai';
  GLOBAL.A.CAT.move = function(){};
  GLOBAL.A.str1 = a;
  GLOBAL.A.str = b;  
  alert(a+b);//3
})();
/*
* @method 功能B:實(shí)現(xiàn)減法運(yùn)算
* @author 工程師乙
* @connect 1234567
* @time 2015-01-01
*/
(function(){
  var a = 2;
  var b = 1;
  GLOBAL.namespace('B');
  GLOBAL.B.str1 = a;
  alert(a-b);//1
})();
/*
* @method 功能C:實(shí)現(xiàn)乘法運(yùn)算
* @author 工程師丙
* @connect 1234567
* @time 2015-01-01
*/
(function(){
  var a = GLOBAL.A.str1;
  var b = GLOBAL.A.str;
  alert(a*b);//2
})();
/*
* @method 功能D:實(shí)現(xiàn)乘2運(yùn)算
* @author 工程師丁
* @connect 1234567
* @time 2015-01-01
*/
(function(){
  var a = GLOBAL.B.str1;
  alert(a*2);//4
})();


讓javascript不再?zèng)_突,需要

  •   [1]避免全局變量的泛濫
  •   [2]合理使用命名空間
  •   [3]為代碼添加必要的注釋

以上就是本文的詳細(xì)內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • JavaScript腳本性能優(yōu)化注意事項(xiàng)

    JavaScript腳本性能優(yōu)化注意事項(xiàng)

    本文總結(jié)了我在JavaScript編程中所找到的提高JavaScript運(yùn)行性能的一些方法,其實(shí)這些經(jīng)驗(yàn)都基于幾條原則
    2008-11-11
  • JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    對于js初學(xué)著必須理解this和srcElement的應(yīng)用,這也是面試中經(jīng)??嫉降?。下面我們就通過幾個(gè)示例來詳細(xì)了解下
    2015-05-05
  • 如何利用JavaScript編寫一個(gè)格斗小游戲

    如何利用JavaScript編寫一個(gè)格斗小游戲

    這篇文章主要給大家介紹了關(guān)于如何利用JavaScript編寫一個(gè)格斗小游戲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JS組件系列之JS組件封裝過程詳解

    JS組件系列之JS組件封裝過程詳解

    JS組件的擴(kuò)展和封裝,我們來感受下JQuery為我們提供$.Extend的神奇,接下來通過本文給大家分享JS組件系列之JS組件封裝過程詳解,需要的朋友參考下吧
    2017-04-04
  • js實(shí)現(xiàn)添加刪除表格操作

    js實(shí)現(xiàn)添加刪除表格操作

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)添加刪除表格操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 淺析JavaScript中的同名標(biāo)識符優(yōu)先級

    淺析JavaScript中的同名標(biāo)識符優(yōu)先級

    這篇文章主要介紹了JavaScript中的同名標(biāo)識符優(yōu)先級。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • Ajax 文件上傳進(jìn)度監(jiān)聽之upload.onprogress案例詳解

    Ajax 文件上傳進(jìn)度監(jiān)聽之upload.onprogress案例詳解

    這篇文章主要介紹了Ajax 文件上傳進(jìn)度監(jiān)聽之upload.onprogress案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 調(diào)用innerHTML之后onclick失效問題的解決方法

    調(diào)用innerHTML之后onclick失效問題的解決方法

    調(diào)用innerHTML之后,onclick失效了,這也是在意料之中的,因?yàn)閕nnerHTML是以文本形式插入的button,所以無法識別onclick事件
    2014-01-01
  • 關(guān)于HTTP傳輸中g(shù)zip壓縮的秘密探索分析

    關(guān)于HTTP傳輸中g(shù)zip壓縮的秘密探索分析

    Gzip是一種流行的文件壓縮算法,現(xiàn)在的應(yīng)用十分廣泛,尤其是在Linux平臺。下面這篇文章主要給大家介紹了關(guān)于HTTP傳輸中g(shù)zip壓縮的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 基于JS實(shí)現(xiàn)快速讀取TXT文件

    基于JS實(shí)現(xiàn)快速讀取TXT文件

    這篇文章主要介紹了基于JS實(shí)現(xiàn)快速讀取TXT文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評論