在同一個頁面中導入多個外部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>