標籤:png logs color undefined 對象 image 不同 定義 src
說明(2017-4-2 18:27:11):
1. 作為函數的參數,就是將函數的資料拷貝一份,傳遞給函數的定義中的參數。
函數foo()在調用的時候,做了兩件事:
(1)函數在調用的時候,首先需要將參數中的資料拷貝一份,即數字123拷貝一份。
(2)跳轉到函數的定義中(函數體),在此之前完成了函數的賦值,即num=123。
(3)正式的進入函數內,準備執行函數的每一句話。
1 function foo(num){}2 var a = 123;3 foo(a);
2. 實值型別作為函數參數傳遞的特徵,函數內與函數外是兩個不同的變數,僅僅是值相等而已。
3. 參考型別作為函數參數傳遞的特徵,函數內與函數外是兩個不同的變數,但是指向同一個對象。
*因此在函數內部允許修改函數外部的對象的資料。
例1:因為沒有先定義p1,所以不存在p1這個對象。報錯:不能設定“未定義”的name屬性。
1 <script type="text/javascript"> 2 var o = {name: "張三", age: 19, gender: "男"}; 3 // copy拷貝的第二種方法,帶參數(第一種方法是return傳回值) 4 o.copy = function(obj){ 5 for(var k in this){ 6 obj[k] = this[k]; 7 } 8 }; 9 var p1;10 o.copy(p1);11 </script>
例2:copy函數裡,設定了obj = {}。不報錯,但watch裡面先是仍然是未定義。因為obj已經重新指向了{}這個Null 物件,已經跟p1沒有關係了,所以可以成功把name等屬性賦值給obj,所以不報錯(只不過函數運行完,函數裡面的資料沒有被引用著,這些資料就會被刪除,釋放記憶體)。但p1仍然是undefined。
1 <script type="text/javascript"> 2 var o = {name: "張三", age: 19, gender: "男"}; 3 // copy拷貝的第二種方法,帶參數(第一種方法是return傳回值) 4 o.copy = function(obj){ 5 // 此處設定obj等於一個Null 物件,天坑!!! 6 var obj = {}; 7 for(var k in this){ 8 obj[k] = this[k]; 9 }10 };11 var p1;12 o.copy(p1);13 </script>
例3:正確做法,直接在外面聲明p1位一個Null 物件。這樣參數obj也指向了同一個Null 物件,只要obj改變了,p1也隨之改變。
1 <script type="text/javascript"> 2 var o = {name: "張三", age: 19, gender: "男"}; 3 // copy拷貝的第二種方法,帶參數(第一種方法是return傳回值) 4 o.copy = function(obj){ 5 for(var k in this){ 6 obj[k] = this[k]; 7 } 8 }; 9 // 正確做法,直接在外面聲明p1位一個Null 物件。10 var p1 = {};11 o.copy(p1);12 </script>
總結:
函數的參數,其實就是一個賦值過程,只不過“賦值”是直接賦值,而“參數”是隱形賦值看不見。
JavaScript進階 物件導向(12)--參考型別實值型別作為參數傳遞的特性