《JavaScript編程精解》讀書筆記-第七章:模塊化


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這幾個推薦看一下吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM