javascript
JS_理解函数参数按值传递
本文是我基于紅寶書《Javascript高級程序設計》中的第四章,4.1.3傳遞參數小節P70,進一步理解javaSript中函數的參數,當傳遞的參數是對象時的傳遞方式。
(結合資料的個人理解,有不正確的地方,希望大家指出,謝謝啦!)
參考的資料有:
https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions21-30/parameter-passed-by-value-or-reference.md
https://segmentfault.com/a/1190000005177386
首先,我們簡單理解一下什么是按值傳遞和按引用傳遞。
按值傳遞:把函數外部的值復制給函數內部的參數,相當把值從一個變量復制到另一個變量,這兩個變量是互不影響的。(傳內存拷貝)
eg:
1 function addTen(num){ 2 num =10; 3 return num; 4 } 5 var count=20; 6 var result=addTen(count); 7 alert(count);//20 8 alert(result);//30?
按引用傳遞:傳內存指針。
按引用傳遞,當向參數傳遞值時,傳遞的是這個值在內存中的地址,所以在局部作用域中對值進行的操作會反映在全局作用域中。因為它們是對同一地址進行操作的。
?
?
?
但是,ECMAScript中,當向參數傳遞引用類型的值時,如果直接說是“按值傳遞”,那么以下代碼執行的結果會讓我們有些疑惑:
code1:
1 function setName(obj){ 2 obj.name="Linshuling"; 3 } 4 var person=new Object(); 5 setName(person); 6 alert(person.name);//Linshuling但是如果因為上面的這種情況就斷定不是“按值傳遞”,而是“按引用傳遞”的話,我們又無法解釋下面的這種情況:
code2:
1 function setName(obj){ 2 obj.name="Linshuling"; 3 obj=new Object(); 4 obj.name="lin"; 5 } 6 var person=new Object(); 7 setName(person); 8 alert(person.name);//Linshuling?
所以,我在網上找到了另一種解釋:
Call-by-sharing?? 傳引用的拷貝。
當我重新閱讀書中對此的解釋時,發現這樣的說法是符合的,書中的解釋時這樣的:在向參數傳遞引用類型的值時,會把這個值在內存中地址復制給一個局部變量,因此這個局部變量的變化會放映在函數外部。(注意此處,是把地址復制給一個局部變量,而不是直接傳地址。)
我是這么理解的:
?
結合上面理解code1,code2:
在code1中 obj.name="Linshuling";會反映到全局作用域,是因為實際上是對同一地址進行了操作,如上圖,即復制后的a的地址add,由于add和ad是一樣的值,所以也會影響a。但是在code2中? obj=new Object(); obj.name="lin"; 這里實際上是在函數內部重寫了obj,即重寫了add,但是是不影響ad的,add和ad的值是完全獨立的(從這里出發理解函數的參數傳遞是按值傳遞的,也就好理解了!),而且這里重新定義的obj是一個局部變量,這個局部變量會在函數執行完畢后立即被銷毀。
?
更多專業前端知識,請上 【猿2048】www.mk2048.com
總結
以上是生活随笔為你收集整理的JS_理解函数参数按值传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tips_一级菜单栏实现
- 下一篇: commonJS — DOM操作(for