讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議187:使用接口解決JavaScript文件衝突 >

建議187:使用接口解決JavaScript文件衝突

在同一個頁面中導入多個外部JavaScript腳本文件時,由於這些外部文件由不同人員編寫,可能會存在重名的對象、函數、方法或變量等。當它們在一起執行時就會出現衝突,並且會產生重名覆蓋現象,最終影響JavaScript腳本的順利執行。例如,新建兩個JavaScript文件,在average_floor.js文件中定義一個average函數,該函數計算兩個參數的平均值。


function average(a,b){

return Math.floor((a+b)/2);

}


在average_round.js文件中也定義了一個同名函數average,該函數計算兩個參數的平均值。


function average(a,b){

return Math.round((a+b)/2);

}


如果在一個頁面中同時導入這兩個文件,那麼就會出現重名函數衝突問題。解決JavaScript文件衝突的最好方法就是利用接口。所謂接口技術就是對函數進行封裝,然後定義一個對外接口,其他文件只能通過這個接口來訪問被封裝的函數。JavaScript代碼封裝的方法是,把函數放在如下的結構體內:


(function{

//接口對像;

//被封裝的函數

})


這種結構體實際上就是一個閉包,創建一個封閉的結構可以有效地避免外部引入衝突。下面對上面兩個文件中的函數進行封裝。

封裝average_floor.js文件中的average函數的代碼如下:


//求兩個數字的平均值——向下取整計算

//封裝average函數,接口為average_floor.average

(function{

average_floor={

average:average

};

function average(a,b){

return Math.floor((a+b)/2);

}

})


在上面這個封閉結構中,average_floor表示接口對象,該對像擁有一個私有屬性average,並指向結構內部的average函數。

封裝average_round.js文件中的average函數的代碼如下:


//求兩個數字的平均值——四捨五入法

//封裝average函數,接口為average_round.average

(function{

average_round={

average:average

};

function average(a,b){

return Math.round((a+b)/2);

}

})


注意,定義的接口對像名不能相同,否則也會出現衝突。

完成JavaScript文件的封裝工作後就可以放心地在同一個頁面中引用這些文件了。例如,在下面示例中同時導入這兩個外部JavaScript腳本文件,重名函數average並沒有發生衝突。


<html>

<head>

<script type="text/javascript"src="average_floor.js"></script>

<script type="text/javascript"src="average_round.js"></script>

<title></title></head>

<body>

<script type="text/javascript"language="javascript">

alert(average_floor.average(7.3,8.6));//為7

alert(average_round.average(7.3,8.6));//為8

</script>

</body>

</html>