【JS】JavaScript中的參數傳遞

来源:http://www.cnblogs.com/BoatGina/archive/2017/02/17/6409829.html
-Advertisement-
Play Games

ECMAScript中所有函數的參數都是按值傳遞的,簡單講就是函數外部的值 複製給函數內部的參數,就和把值從一個變數複製到另一個變數一樣。切記訪問變數有按值訪問和按引用訪問,而參數只能按值傳遞。 在向參數傳遞基本類型的值時,被傳遞的值會被覆制給一個局部變數(可以把ECMAScript函數中的參數想象 ...


  ECMAScript中所有函數的參數都是按值傳遞的,簡單講就是函數外部的值 複製給函數內部的參數,就和把值從一個變數複製到另一個變數一樣。切記訪問變數有按值訪問和按引用訪問,而參數只能按值傳遞。

       在向參數傳遞基本類型的值時,被傳遞的值會被覆制給一個局部變數(可以把ECMAScript函數中的參數想象成局部變數);向參數傳遞引用類型的值時,會把這個值在記憶體中的地址複製給一個局部變數。

       實例1:

// 參數是基本類型的值 
function add(n){
	n += 1;
	return n;
}

var num = 2;
var result = add(num);
alert(num);  // 2
alert(result);  // 3

  

  在函數內,參數n的值被加上1,但這並不會影響函數外的num變數,參數n與變數num僅僅是具有相同值,但互不相識。如果是按引用傳遞,則變數num的值將變為3.

 

       實例2:

// 參數是對象
function setName(obj){
	obj.name = "123";
}

var p = new Object();
setName(p);
alert(p.name);  // "123"

  

這裡創建了一個對象,並保存在變數p中,當這個對象被傳遞到setName()函數中之後就被覆制給了obj。在函數內,obj和p引用的是同一個對象。也可以說即使這個對象是按值傳遞的,obj也會按引用來訪問同一個對象。所以在函數內為obj添加name屬性後,函數外的p會反映出來,這裡p指向的對象在堆記憶體中只有一個,並且是全局對象。

       很多錯誤地認為在局部作用域中修改的對象會在全局作用域中反映出來,就說明是按引用傳遞。為了證明上面例子是按值傳遞,再看下麵的實例3:

function setName(obj){
	obj.name = "123";
	obj = new Object();  // obj的值變為堆記憶體中一個新的地址,但o變數的值並不受影響
	obj.name = "321";
}

var p = new Object();
setName(p);
alert(p.name);  // "123"

  

這裡與實例2中不同的是給obj重新定義了一個對象,並重新定義了name屬性。如果p是按引用傳遞的,那麼p就會自動被修改為指向name屬性值為“321”的新對象,但實際訪問p.name時,值仍是“123”。這就說明雖然在函數內修改了參數的值,但原始變數的引用不會受影響,保持不變。其實當參數是對象時,按值傳遞時傳遞的就是對象在堆記憶體中的地址  另:當在函數內部重寫obj時,這個變數引用的就是一個局部對象了,而這個局部對象在函數執行完後立即被銷毀。

 

       在Java中也類似,以下是簡單的實例:

public class Demo14 {
	public static void main(String[] args) throws Exception{
		int num = 2;
		int result = add(num);
		System.out.println(num);  // 2
		System.out.println(result);  // 3
		
		Obj o = new Obj();
		setObjName(o);
		System.out.println(o.getName());  // 123
		
	}
	
	public static int add(int n){
		n += 1;
		return n;
	}
	
	public static void setObjName(Obj obj){
		obj.setName("123");
		
		obj = new Obj();  // obj的值變為堆記憶體中一個新的地址,但o變數的值並不受影響
		obj.setName("321");
	}
	
}

class Obj{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

  


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

-Advertisement-
Play Games
更多相關文章
  • DOM事件模型 在0級DOM事件模型中,它只是簡單的執行你為它綁定的事件,比如你為某個元素添加了一個onclick事件,當事件觸發時,它只是去調用我們綁定的那個方法,不再做其他的操作。 在2級DOM事件模型中,就比較複雜一些,它將不再是單純的調用一下自身綁定的事件就完事了,它還擁有機會去處理它的祖先 ...
  • 在發送簡訊息驗證碼的時候要用到js設置時間倒序問題:有時候這種常規寫法會導致js失效,試了很多方法才找到問題所在,可能是因為js版本過低導致。 解決方法: jquery代碼:必須用input設置value值,以便利用jquery更改value值 ...
  • 作為一名準前端開發工程師,必須要對http基礎知識有一定的瞭解,可是想學習HTTP相關的知識,發現國內只有兩本相關的圖書,《HTTP權威指南》和《圖解http》,所有的書但凡帶上權威指南,必將是聖經級別的圖書,我在學校圖書館借了一本,600多頁的磚頭書,由於基礎太過薄弱,根本讀不下去,於是轉向了《圖 ...
  • 本節內容我們繼續探討關於ES2015的一些新的內容,Object.assign函數的使用,使用該函數我們可以快速的複製一個或者多個對象到目標對象中,本文內容涉及es6,es7相關的對象複製的內容,以及一些es5的替代方案的介紹。 函數原型 首先看一下函數的定義: 函數參數為一個目標對象(該對象作為最 ...
  • 什麼是babel? babel是一個強大的多用途js編譯器 點擊進入 "官網" 安裝babel babel配置文件 通過.babelrc來表示 命令行的簡單使用 我們可以通過 o ( out file) 參數來編譯一個文件 如果我們想編譯整個目錄 d ( out dir)參數 預設 現在有一段es6 ...
  • 官網鏈接:http://echarts.baidu.com/index.html 官網的demo,api都很詳細;我就分享下我的學習步驟 首先定義一個顯示圖標的區域: <div id="main1" style="width: 600px;height:400px;"></div> js代碼先貼上: ...
  • HTML: CSS: JS: 步驟: 1、引入zTree相關js、css文件(以我自己的項目為例:jquery.ztree.all-3.5.min.js,zTreeStyle.css); 2、將上面給出的右鍵菜單插件另存為js文件引入頁面(以我自己的項目為例:bsContextmenu.js) 3、 ...
  • Vue2.0 + MuseUI 的 cnodejs.org 社區WebApp,包含全部模塊功能 非常適合初學Vue2.0之後,自己實踐的第一個項目 源碼github地址sourceCode內附線上demo,歡迎大家star ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...