iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
Modern Web

I Want To Know JS系列 第 7

JavaScript - 參數傳遞方式 (1)

  • 分享至 

  • xImage
  •  

JavaScript 中,很多人認為 原始型態是透過 Call by value,而物件型態是透過 Call by Reference,但實際上是如何呢?

本篇我們會先介紹各種語言中常見的三種參數傳遞方式,有了這些基礎概念,我們才能深入探討 JavaScript 的內部運作原理。

三種參數傳遞方式

Call by value

變數中內存值,當要把值指派給另一個變數時,指派變數 會將值複製給 被指派變數,因此兩個變數內容的值相同,但是記憶體位置是不同的。

範例

  • 兩個主角: 變數 a & 變數 b

  • 故事: 將變數 a 指派給一個 新變數 b ( var b = a )

  • 記憶體內容:

    1. 一開始只有一個變數 a,其中的內容為 hello world
      https://ithelp.ithome.com.tw/upload/images/20171226/2010779063rhyv8IxW.png

    2. 變數 a 指派內容給變數 b

      變數 b 會被分配到一個新的記憶體位置,其中的內容也是 hello world
      https://ithelp.ithome.com.tw/upload/images/20171226/20107790X60A70jn42.png

Call by reference

變數中內存值,當要把值指派給另一個變數時,被指派變數 被設為 指派變數記憶體位置的別名,因此兩個變數代表相同的記憶體位置

範例

  • 兩個主角: 變數 a & 變數 b

  • 故事; 將變數 a 指派給一個 新變數 b ( var b = a )

  • 記憶體內容:

    1. 一開始只有一個變數 a,其中的內容為 hello world
      https://ithelp.ithome.com.tw/upload/images/20171226/2010779063rhyv8IxW.png

    2. 變數 a 指派內容給變數 b

      變數 b 被設為 變數 a 的別名
      https://ithelp.ithome.com.tw/upload/images/20171226/20107790oDELD5wDi4.png

Call by sharing

類似 C++ 中的指標。

變數中內存值的記憶體位置,當要把值指派給另一個變數時,指派變數 將記憶體位置複製給 被指派變數,因此兩個變數指向相同的記憶體位置

嚴格來說 Call by sharing 其實是 Call by value,只是 value 是記憶體位置而不是實際內容

範例

  • 兩個主角: 變數 a & 變數 b

  • 故事: 將變數 a 指派給一個 新變數 b ( var b = a )

  • 記憶體內容:

    1. 一開始只有一個變數 a,其中儲存的內容為 hello world 的記憶體位置 (不是直接存 hello world 這個值)
      https://ithelp.ithome.com.tw/upload/images/20171226/20107790ZajAb0NWwF.png

    2. 變數 a 指派內容給變數 b

      變數 b 會被分配到一個新的記憶體位置,裡面也是儲存為 hello world 的記憶體位置
      https://ithelp.ithome.com.tw/upload/images/20171226/20107790fm9ZtsIfIl.png

小結

在本篇中,介紹了三種常見的參數傳遞方式 call by valuecall by referencecall by sharing

下一篇,我們會介紹 JavaScript 是以哪個參數傳遞方式實作的。

參考

http://wp.mlab.tw/?p=176

https://www.slideshare.net/YiTaiLin/java-script-63031051

保哥 JavaScript 開發實戰:核心概念篇


上一篇
JavaScript - 變數
下一篇
JavaScript - 參數傳遞方式 (2)
系列文
I Want To Know JS32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言