7.1模塊
js本身其實沒有類的概念,所以平時寫js都是在一個全局環境中任意的寫,當然這是初學者的一般做法。這樣就時的代碼非常的亂,也會使自己出現函數調用錯誤、變量重定義等很多問題,如何解決就要靠模塊化了。就是把有一定關聯的變量或者函數集中放到一個‘地方’。關於這里的‘地方’可以是一個函數,一個js文件,或者是文件夾。總之就是讓代碼分開,別糾纏在一起。
從最簡單的一個例子說起,比如下面兩個獨立函數:
function forEachIn(object,action){ for(var property in object){ if(Object.prototype.hasOwnProperty.call(object,property)){ action(property,object[property]); } } } function forEach(array,action){ for(var i = 0; i<array.length; i++){ action(array[i]); } }
上面兩個是典型的獨立函數,我們會經常使用,但是覺對我們的js文件沒有任何依賴。像這樣的函數如果定義在js中不光是寫重復代碼增加勞動量,而且也會使原本的代碼更亂。最好的方法自然是把這一類的代碼統統放到單獨的文件中,然后引用它。
另外就是文件的模塊化,指的是把不同的模塊寫到不同的文件當中。比如有a.js和b.js兩個文件,而b.js中的函數需要用到a.js中的函數(有依賴關系),現在需要做的就是把這兩個文件全部引用到test.html中(這是你的應用場所)。這樣之后引入的兩個腳本之間就能夠互相訪問對方的內容了。
<html> <head> <script type="text/javascript" src="b.js"></script> <script type="text/javascript" src="a.js"></script> <script type="text/javascript"> function add1(a,b){ return a * b; } alert(add2(1,2,3)); </script> </head> </html>
上面的代碼中有3個地方可以定義函數。1.在a.js中定義,2.在b.js中定義,3.在當前的<script></script>標簽中定義。並且 這三個地方的腳本是能相互訪問的。
7.2模塊的形態
當在全局的環境中定義變量的時候很容易導致命名空間的污染,js對於重復定義的變量是不會報錯的,這樣大家對待全局的變量的時候就該更謹慎一些,而且是盡量不要這樣做。下面的代碼告訴你封裝成模塊的一個方法:
//普通的寫代碼方式 var names = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; function getMonthName(number){ if(arguments.length > 0){ if(number >= 1) return names[number-1]; }else{ return "have no this month"; } } function getMonthNumber(name){ for(var i = 0; i<names.length; i++){ if(names[i] == name) return i+1; } } //---------------------------------------------------- //下面把names全局變量封裝起來,只把兩個函數的調用露出來 function buildMonthNameModule(){ var names = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; function getMonthName(number){ if(arguments.length > 0){ if(number >= 1) return names[number-1]; }else{ return "have no this month"; } } function getMonthNumber(name){ for(var i = 0; i<names.length; i++){ if(names[i] == name) return i+1; } } window.getMonthName = getMonthName; window.getMonthNumber = getMonthNumber; } function getMonthName(){ return "zhangran"; } buildMonthNameModule();//綁定到window對象 alert(getMonthName()); //這個操作之后會優先調用buildMonthNameModule()里面的同名函數。
7.3接口設計
沒啥好說的,書上說的又是概念一大堆。
不過書中還是有一個例子代碼寫得不錯,我一時竟沒反應過來,js中函數即為值這點還是理解的不夠啊,代碼如下:
//該函數的作用是找出數組中符合一定規則的元素,當然,‘規則’是動態指定的,如果不給出則默認是“==”
function positionOf(element,array,compare,start,end){ if(start == null) start = 0; if(end == null) end = array.length; for(;start<end;start++){ var current = array[start]; if(compare ? compare(element,current):element == current)//這一行寫的有點意思 return start; } }
7.4JS庫
列舉了幾個常用的js庫。自己平時用最多的自然還是jQuery了,這個毋庸置疑,而且別的很多庫也是基於jQuery的。另外還有dwz,jQueryUI,bootstrap,knockout這幾個推薦看一下吧。