學習筆記:JavaScript傳參方式———ECMAScript中所有函數的參數都是按值傳遞

来源:http://www.cnblogs.com/Jewl/archive/2016/04/27/5440791.html
-Advertisement-
Play Games

我們把命名參數(arguments)視為局部變數,在向參數傳遞基本類型值時,如同基本類型變數的複製一樣,傳遞一個副本,參數在函數內部的改變不會影響外部的基本類型值。如: 在向參數傳遞引用類型的值時,會把這個值 在記憶體中的地址複製給一個局部變數,因此這個局部變數的變化會反映子啊函數的外部,例如: 這個 ...


      我們把命名參數(arguments)視為局部變數,在向參數傳遞基本類型值時,如同基本類型變數的複製一樣,傳遞一個副本,參數在函數內部的改變不會影響外部的基本類型值。如:

1 function add10(num){
2 num += 10 ;
3 return num ;
4 }
5 var count = 10 ;
6 var result = add10(count);
7 alert(count);// 10
8 alert(result); //20

    在向參數傳遞引用類型的值時,會把這個值 在記憶體中的地址複製給一個局部變數,因此這個局部變數的變化會反映子啊函數的外部,例如:

function addName(obj){
    obj.name = "Jewl";
}
var someBody = new object();
addName(someBody);
console.log(someBody.name);    //"Jewl"

這個例子其實是很讓人困擾的,因為它更像按引用傳遞,說到傳遞方式,一般分為兩種:

1.按值傳遞(call by value):函數的形參是被調用時所傳實參的副本。修改形參的值並不會影響實參。

2.按引用傳遞(call by reference):函數的形參接收實參的隱式引用,而不再是副本。這意味著函數形參的值如果被修改,實參也會被修改。同時兩者指向相同的值。

為了證明引用類型也是按值傳遞的,我們可以看看下麵一個例子:

function addName(obj){
    obj.name = "Jewl';
    obj = new object();
    obj.name = "Kancy";
}
var someBody = new object();
addName(someBody);
console.log(someBody.name)    //"Jewl"

與前面一個例子的區別是,本例將一個新對象賦值給形參,如果是按引用傳遞,那麼someBody的name也會隨之改變,顯然不是。在函數內部給obj賦值時,這個變數引用就變成了一個局部變數,在函數執行完就會被銷毀。

  為了加深理解,我會再來看看js中引用類型值的存儲,在js中,引用類型值是保存在記憶體中的對象,JavaScript不允許直接訪問記憶體中的位置,也即不能直接操作對象的記憶體空間,在操作對象時,實際上是操作對象的引用而不是實際的對象。引用類型的值是按引用訪問的。因此改變其中一個變數,就會影響另外一個變數。

var obj1 = new Object();
var obj3 = new Object();
var obj2 = obj1;
obj1.name = "Jewl";
obj3.name = "Kancy";
console.log(obj1.name); //"Jewl"
console.log(obj2.name); //"Jewl"
obj1 = obj3;
console.log(obj1.name); //"Kancy"
console.log(obj2.name); //"jewl"
console.log(obj3.name); //"kancy"

當我們把obj1賦值為obj3時,obj1指向和obj3相同的對象,obj2依然指向之前的對象。由此可以看出傳參過程和此處類似,但不屬於按引用傳參,所以講JavaScript里參數傳遞均歸為按值傳遞。

JavaScript新手,第一次發文,請多指教。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一章介紹了android系統移植與驅動開發的一些基本的概念,我做瞭如下總結: 一、android的系統架構分為四層 第一層是linux內核層 第二層是c/c++代碼庫 第三層是android Sdk API 第四層是應用程式層 android系統移植與驅動開發主要就是在linux內核層上進行的。a ...
  • oaoDailog開發幫助 1. 幫助文檔關鍵字 boostrap模態框oaoDailog 2. 使用場景 當網頁上點擊某個按鈕需要給予用戶提示確認,用戶點擊確認按鈕才能繼續執行,或者用戶點擊取消按鈕則取消執行操作; 當網頁上點擊查看,展示的數據需要使用彈出框展示的情況下,可以使用oaoDailog ...
  • Stylus是一款需要編譯的css語言,所以其本身文件不能被html直接調用,需要要編譯為css文件後再進行日常的載入。 stylus是一款優秀的css編譯語言,需要node.js支持,第一步需要安裝node.js 問題:Windows調試時ctrl+d無效果 ctrl+c退出? 怎樣直接在wind ...
  • 前兩天編寫了一個前端頁面,在本機上顯示一切正常。不過在不斷的測試中,發現了一個嚴重的問題,如果圖片過大,會撐破div溢出來。再由於頁面是自適應頁面,根據不同解析度的顯示器會做出相應的div寬度調整,所以圖片即使不大,但是因解析度不同也會出現溢出的情況。 這裡探討總結一下解決方法。 首先我們先來做個簡 ...
  • CSS3新特性,相容性,相容方法總結 css3手冊 "css3手冊" 邊框 border radius 用於添加圓角效果 語法: 用長度值設置對象的圓角半徑長度。不允許負值 用百分比設置對象的圓角半徑長度。不允許負值 實例: 相容性: IE9+,Firefox4+,Chrome5+,Safari5+ ...
  • 1.rem和em、px 首先來說說em和px的關係 em是指字體高度 瀏覽器預設1em=16px,所以0.75em=12px;我們經常會在頁面上看到根元素寫的font-size:65%; 這樣em就成了16px*62.5=10em;這是顯示在頁面的字體大小是10px; 這樣12px=1.2em,10 ...
  • z-index在日常開發中算是一個比較常用的樣式,一般理解就是設置標簽在z軸先後順序,z-index值大的顯示在最前面,小的則會被遮擋,是的,z-index的實際作用就是這樣。 但是你真的瞭解z-index嗎?你知道它有什麼特性嗎?這裡先拋出幾個名詞:“層疊順序(stacking order)”,“ ...
  • 這個列表包括20個我們覺得是最有用的免費的 jQuery 插件,它們都是最具創新性和最省時省力的解決方案,很多都是現代化的設計和開發中碰到的問題的處理方案。如果你熟悉下麵列出的任何插件,請與我們的讀者分享您的意見,或者如果您知道的我們還沒有包括的話,請與我們分享在下麵的評論部分。 您可能感興趣的相關 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...