传递参数的2种情况的理解。
最近差不多一個月沒寫博客了,主要的原因是目前在使用 Markdown 寫學到的一些心得,一方面方便記筆記,另一方面頁面排版更加的美觀。
個人筆記站點 : https://yewenxiang23.github.io
碰到的問題:
今天碰到一個關于傳遞參數的問題,想了一下午,終于想通了,打算總結記錄一下:
解決的思路:傳參是值復制的一個過程,傳遞的是值,
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name); //yewenxiang上面的代碼輸出了 "yewenxiang",而不是"ye"。感覺非常的怪異,下面來對于傳遞參數做一個總結。
?
傳遞參數:
- 所有的函數參數都是按值傳遞的
也就是說,把函數的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。
值有兩種類型:
- 基本類型:值保存在棧內存中,復制的時候也是把值同時也復制了一份。
- 引用類型:值保存在堆內存中,棧內存中保存的只是指向堆內存中值的一個指針,復制的時候紙箱基本類型傳參:
例子就拿 《javascript高級程序設計》上的例子來說
基本類型的值傳參:
1 function addTen(num){ 2 num += 10; 3 return num; 4 } 5 var count = 20; 6 var result = addTen(count); 7 console.log(count); //20 8 console.log(result); //30函數 addTen() 有一個num 參數,而參數實際上是函數的局部變量。在調用這個函數,并傳入參數 count時。由于 count的值為20,傳遞參數的過程是一個值得復制過程,也就是把 count 的值20,復制給了參數(函數的局部變量) num = 20。在堆內存中存在了 count=20 和num=20,兩個變量是互相不干擾的。
引用類型的值傳參:
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 } 4 var person = new Object(); 5 setName(person); 6 console.log(person.name); //"yewenxiang"這個例子中傳入了一個 person 對象,也就是引用類型,引用類型的復制和基本類型的復制不同,復制的是棧內存 變量person 中保存的地址,這個地址也指向堆內存中同一個對象。所以修改了函數局部變量 obj的name屬性為"yewenxiang" ,person.name也變為了"yewenxiang"。
證明參數是按值傳遞的一個例子:
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name);這是我碰到的問題,開始我想的是輸出 "ye" ,為什么會輸出 "yewenxiang"呢。明明obj代表的是person這個對象,而函數內部賦值之后又重新構造了一個新對象并賦值為 "ye",所以應該輸出 "ye"啊,為什么不是呢?那肯定是想錯了嘛。廢話少說 直接上圖:
上面3.4行代碼執行之前:
3.4行代碼執行之后:
由于obj為函數的局部變量,那么我們如何證明呢?
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 console.log(obj.name); //yewenxiang 4 obj = new Object(); 5 obj.name = "ye"; 6 console.log(obj.name); //ye 7 } 8 var person = new Object(); 9 setName(person); 10 console.log(person.name); //yewenxiang 11 console.log(obj.name); //報錯這樣就證明了我的想法是正確的。
?
?
轉載于:https://www.cnblogs.com/yewenxiang/p/6337961.html
總結
以上是生活随笔為你收集整理的传递参数的2种情况的理解。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fragment生命周期与宿主Activ
- 下一篇: 原生JS理解