關於Javascirpt傳值與傳址的紀錄
也就是說記憶體會再複製一份。
<!DOCTYPE html> <html lang="zh-Hant-TW"> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>標題</title> <script type="text/javascript"> var paramA = 'original'; document.write(paramA + '<br />'); //輸出 original function changeParamA(paramA) { paramA = 'changed'; document.write(paramA + '<br />'); //輸出 changed } changeParamA(paramA); //在函數中運作,輸出 changed document.write(paramA + '<br />'); //輸出 original </script> </head> <body> </body> </html> 輸出結果: original changed original
看到第15行,在外面再輸出一次還是original。
傳物件進去
<!DOCTYPE html> <html lang="zh-Hant-TW"> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>標題</title> <!--引入javascript檔<script src="jquery-2.1.4.min.js" type="text/javascript"></script>--> <!--jQueryCDN<script src="https://code.jquery.com/jquery-3.1.1.js" integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA=" crossorigin="anonymous"></script>--> <!--引入CSS檔<link rel="stylesheet" type="text/css" href="table_CSS.css" />--> <!--內嵌CSS碼<style type="text/css"></style>--> <script type="text/javascript"> //宣告變數,資料類型為物件 var paramB = { attr: 'original' }; document.write(paramB.attr + '<br />'); //輸出 original function changeParamB(paramB){ paramB.attr = "changed"; document.write(paramB.attr + '<br />'); //輸出 changed } changeParamB(paramB); //在函數中運作,輸出 changed document.write(paramB.attr + '<br />'); //輸出 changed </script> </head> <body> </body> </html> 輸出: original changed changed從頭到尾記憶體只有一份! 第18行,直接對物件的屬性做修改,所以改的是同一份內容。
再看一個比較範例:
<!DOCTYPE html> <html lang="zh-Hant-TW"> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>標題</title> <!--引入javascript檔<script src="jquery-2.1.4.min.js" type="text/javascript"></script>--> <!--jQueryCDN<script src="https://code.jquery.com/jquery-3.1.1.js" integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA=" crossorigin="anonymous"></script>--> <!--引入CSS檔<link rel="stylesheet" type="text/css" href="table_CSS.css" />--> <!--內嵌CSS碼<style type="text/css"></style>--> <script type="text/javascript"> var paramAry = ["original"]; document.write("一開始原始的輸出:"+paramAry[0] + "<br />"); //輸出 original function changeParamAry1(paramAry) { paramAry = ["changed"]; document.write("changeParamAry1函式中的輸出:"+paramAry[0] + "<br />"); //輸出 changed } function changeParamAry2(paramAry) { paramAry[0] = "changed"; document.write("changeParamAry2函式中的輸出:"+paramAry[0] + "<br />"); //輸出 changed } changeParamAry1(paramAry); //在函數中運作,輸出 changed document.write("呼叫changeParamAry1後再印出"+paramAry[0] + "<br />"); //輸出 original document.write("<br/>"); changeParamAry2(paramAry); //在函數中運作,輸出 changed document.write("呼叫changeParamAry2後再印出"+paramAry[0] + "<br />"); //輸出 changed </script> </head> <body> </body> </html> 輸出結果: 一開始原始的輸出:original changeParamAry1函式中的輸出:changed 呼叫changeParamAry1後再印出original changeParamAry2函式中的輸出:changed 呼叫changeParamAry2後再印出changed
沒有留言:
張貼留言