最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實例講解避免javascript沖突的方法

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

本文實例講解了如何避免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,產生沖突。于是使用匿名函數(shù)將腳本包起來,讓變量作用域控制在匿名函數(shù)之內。

//功能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]此時有了新需求,網頁中加入功能C,且需要用到功能A中的變量b。于是在window作用域下定義一個全局變量,把它作為一個橋梁,完成各匿名函數(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呢,這時就需要再定義一個全局變量

//全局變量
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ù)之間需要通信的變量越多,需要的全局變量也就越多。因此需要嚴格控制全局變量的數(shù)量,使用hash對象作為全局變量,可以將需要的變量都作為對象的屬性,可以保證全局變量的個數(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]由于工程師丁只關心自己的匿名函數(shù)和功能B的匿名函數(shù),使用GLOBAL.str卻無意中覆蓋了功能A中設置的同名變量,導致功能C出錯。于是使用命名空間來解決這個問題,在不同的匿名函數(shù)下,根據功能聲明一個不同的命名空間,然后每個匿名函數(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]如果同一個匿名函數(shù)中的程序非常復雜,變量名很多,命名空間還可以進一步拓展,生成二級命名空間

//以功能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]因為生成命名空間是個非常常用的功能,進一步將生成命名空間的功能定義成一個函數(shù),方便調用,完整版本改寫后的代碼如下

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]代碼的沖突問題已經解決了,但可維護性并不強。比如,現(xiàn)在需要讓工程師甲去修改功能B。因為工程師甲寫的腳本是關于功能A的,他并不知道功能B的腳本情況。為了改善這種局面,需要給代碼添加適當?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:實現(xià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:實現(xià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:實現(xià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:實現(xiàn)乘2運算
* @author 工程師丁
* @connect 1234567
* @time 2015-01-01
*/
(function(){
  var a = GLOBAL.B.str1;
  alert(a*2);//4
})();


讓javascript不再沖突,需要

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

以上就是本文的詳細內容,希望對大家的學習有所幫助。

相關文章

  • JavaScript面向對象編程

    JavaScript面向對象編程

    暫時放棄js框架吧 開始寫javascript的時候都是自己寫,后來發(fā)現(xiàn)了prototype.js框架,發(fā)現(xiàn)很好用,就一直用的,他的對象創(chuàng)建方法被修改了,但很好用,再后來又轉用jquery框架,受此框架影響,也不用自己創(chuàng)建類了,漸漸的竟然忘記了如何自己定義類了,猛的給一個一般方法,竟然看著別扭,混淆了很多東西,忘記了很多東西。今天回頭整理下。 一下方法參考prototype.js
    2008-03-03
  • Bootstrap按鈕下拉菜單組件詳解

    Bootstrap按鈕下拉菜單組件詳解

    這篇文章主要為大家詳細介紹了Bootstrap按鈕下拉菜單組件,感興趣的小伙伴們可以參考一下
    2016-05-05
  • javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法

    javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法

    這篇文章主要介紹了javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法,涉及javascript屬性菜單的定義、構造及遍歷等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript實現(xiàn)可拖拽的進度條

    JavaScript實現(xiàn)可拖拽的進度條

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)可拖拽的進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • JAVASCRIPT下判斷IE與FF的比較簡單的方式

    JAVASCRIPT下判斷IE與FF的比較簡單的方式

    在JAVASCRIPT當中可以通過取當前瀏覽器返回值來判斷當前使用什么瀏覽器。
    2008-10-10
  • 一文帶你了解async/await的使用

    一文帶你了解async/await的使用

    async/await?讓異步代碼變成同步的方式,從而使代碼更具表現(xiàn)力和可讀性;還統(tǒng)一了異步編程的經驗;以及提供了更好的錯誤堆棧跟蹤。本文就來講講async/await的使用,需要的可以參考一下
    2022-09-09
  • JavaScript實現(xiàn)的一個倒計時的類

    JavaScript實現(xiàn)的一個倒計時的類

    這篇文章主要介紹了JavaScript實現(xiàn)的一個倒計時的類,本文直接給出demo代碼,需要的朋友可以參考下
    2015-03-03
  • 關于Javascript中值得學習的特性總結

    關于Javascript中值得學習的特性總結

    本文主要介紹了一些Javascript中值得學習的特性,可選鏈操作符,空值合并運算符,Promise.allSettled(),BigInt類型等特性,文中有詳細的代碼示例介紹這些特性,感興趣的可以參考下
    2023-05-05
  • 根據鼠標的位置動態(tài)的控制層的位置

    根據鼠標的位置動態(tài)的控制層的位置

    根據鼠標的位置動態(tài)的設置層的位置的js代碼。
    2009-11-11
  • javascript模擬命名空間

    javascript模擬命名空間

    JavaScript 沒有任何特定語言功能來支持命名空間,但很容易使用對象來模擬命名空間。今天我們就來探討下這個問題,希望大家能夠喜歡。
    2015-04-04

最新評論

江山市| 武鸣县| 墨竹工卡县| 资溪县| 高邑县| 丰都县| 乌苏市| 西藏| 西峡县| 泸西县| 呼图壁县| 汉源县| 望谟县| 唐山市| 海林市| 门源| 丰都县| 游戏| 寿阳县| 车险| 西乡县| 资源县| 上林县| 绥滨县| 瑞金市| 墨竹工卡县| 图木舒克市| 永宁县| 梓潼县| 苍山县| 维西| 民勤县| 祁东县| 阿拉善左旗| 新和县| 汕头市| 林口县| 普兰店市| 青河县| 乌拉特后旗| 醴陵市|