日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS_理解函数参数按值传递

發布時間:2023/12/2 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_理解函数参数按值传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。