接上篇,其實Javascript調試網上有教程的,這裏貼一個菜鳥網教程裏的:Firebug使用教程
還有一個小技巧,在Javascript裏面設置一個關鍵字:debugger(通常單獨放在一行),那麼運行起來的時候,斷點會自動在debugger的地方停下來,而後就能夠進行調試了。這也是一個比較經常使用的調試技巧。
參數傳值和引用類型
怎麼解釋參數傳值呢?通常函數的參數傳值分爲按值傳遞與按引用(或者叫按指針)傳遞,正常狀況下函數的參數都是按值傳遞,某些編程領域支持按參數傳遞參數(通常使用關鍵字ref、out或者取地址符號&等),Javascript貌似不支持按引用傳遞參數。OK咱們先拋開參數傳值不談,咱們先談一下值類型(也叫基本類型)和引用類型的區別,由於Javascript實際上是區分值類型和引用類型的,固然大部分的現代編程語言都支持,那麼什麼是引用類型什麼是值類型呢?我在下面稍微闡述一下:html
值類型,一般表示一個值,從現實抽象來講,表示一個無狀態的數據,好比數字、聲音、文本等,值類型的賦值通常是拷貝操做,好比:var a = 1; var b = a;第二句咱們把a的值賦給a,實際上是把a的值拷貝一份,而後b實際上存儲的是a的值的拷貝1.雖然它們的值都是1,可是他們在內存中是存儲在不一樣的地方。若是此時咱們再加一句代碼,b = 2;此時b的值變爲2了,可是a的值仍是1。值類型通常是不可變的。因此在按值傳遞的函數中,傳遞的參數,若是在內部改變了它的值,其實只是改變參數拷貝副本的值。好比寫一個函數function double(a) { a = a*2; } 而後調用double(a),這實際上並不會改變a的值,由於函數內部的參數a其實是外面變量a的一個拷貝副本(其實函數參數a改成b或c都行,它只是一個參數代號,和用來存儲外面變量a的副本。)。
引用類型,引用類型一般表示一個對象,從現實抽象來講,表示一個有狀態的東西,好比人、動物,對象通常是具備行爲的,能夠改變內部狀態,因此引用類型其實也是可變的(注意這個可變)。在內存中,引用類型的賦值其實就是內存地址的拷貝操做,好比我在看中央5套,我打電話告訴你讓你也看中央5套,這裏中央5套表示內存地址,而打開電視之後,電視裏放的體育節目就是內存中存放的真實值。因此,引用的賦值等因而多個變量都指向同一塊內存。這裏有個比較繞的概念,我舉個例子,var x = new Person(); x.Name="bruce";x.Age=18; var y = x;看到沒有,此時y和x指向同一我的(不是拷貝或副本),OK,此時 y.Age=19,此時y改變了人的年齡屬性,這時調用 x.Age看看,x.Age也是19了(能夠本身建一個Person類對象寫代碼試試,類或者叫對象都是引用類型)。可是這裏要注意了,若是y從新賦值 y = new Person(); y.Name="andy";此時x的值會變成andy嗎?不會,爲何呢?對象或者說引用類型的可變性是表示對象能夠改變內部狀態,可是對象不能改變它本身,上述y=new Person();其實等因而將y從新指向了一個新的對象。我舉個例子,我和你坐在一個桌子上吃飯,我和你都指向桌子這個對象,你夾菜吃菜都會改變桌子內部數據的狀態,我夾菜吃菜也同樣,就是說咱們兩個同事能夠改變一個對象的內部數據狀態。可是,若是我注意了,雖然我夾菜的動做是能夠改變狀態而且對你可見。可是若是我換一個桌子吃飯呢?此時我和你就再也不指向同一個對象了,理解了沒有?
函數傳值,理解了值類型(或者叫基本類型)和引用類型以後,再理解函數傳值就比較簡單了,若是是按值傳參數,那麼在函數內實際上是參數的拷貝,若是參數是引用類型,那麼拷貝的就是內存地址(電視機看中央5套的例子,中央5套就是內存地址,體育節目就是內存數據)。此時其實能夠在參數內部改變內存地址指向的數據狀態,可是不能改變存儲內存地址的指針自己。好比 function ChangeAge(person) { person.Age=18;} ,假設person是引用類型,這裏按值傳遞 內部能夠改變person的內部狀態屬性。可是 function ChangePerson(person) {person = new Person();} 這個函數裏面把person從新指向另外一個地址,這只是改變了指針的指向,不會改變指針原來指向的內存數據的內容,要懂得區別。那什麼狀況下能夠改變指針的指向呢?那就是按引用傳遞了,Javascript裏面沒有按引用傳遞參數,我這裏暫時先不提編程我這裏描述得不必定好理解,儘可能仔細讀一下吧。網上有講得比較細的一些文章,主要是配了一些圖片,比較容易幫助理解,你本身去搜過來看一下吧,必定要注意引用類型和值類型的區別。編程語言
我把示例代碼放到了附件中,你本身下載下來跑一下,感覺一下區別函數
源碼下載debug