iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0

今天研究了一下javascript 函式的參數是傳值還是傳址

大概歸類成3 種現象

以參數類型來分類

參數是一個值 為傳值呼叫(call by value)

var a=3,b=5;
function myFunc(a,b){
	a=100;
	b=100;

}
myFunc(a,b);
console.log(a,b);

這邊是傳值呼叫,把a 的值copy 了一份進function做運算
所以並不影響外層a,b的值
https://ithelp.ithome.com.tw/upload/images/20181015/20110579Dqkl8Z2U3q.png

參數是一個collection 為傳址呼叫(call by refference)

很妙吧...不用傳位址,他自動就會跑去改了...
看一下範例馬上就知道

aaa=[1,2,3,4,5]
function myFunc(arrayType){
	arrayType[0]=99;

}
myFunc(aaa);
console.log(aaa);

https://ithelp.ithome.com.tw/upload/images/20181015/20110579uGK0NzM8cJ.png

那傳物件呢?物件是否也是個集合呢?

objA={
    a:10,
    b:5

}
function myFunc(objType){
	objType.a=99;

}
myFunc(objA);
console.log(objA);

https://ithelp.ithome.com.tw/upload/images/20181015/20110579V4gK2yCcsf.png

傑克,這真是太神奇了!

參數是一個collection 若直接賦值,外層變數將不會被更改

傑克說:還有更神奇的呢!
傑克抖了2下煙斗,看著窗外若有所思的說…嗯…但如果不是改變物件的屬性,是直接替換的話…
這時外層的物仲不會被改動的

objA={
    a:10,
    b:5

}
function myFunc(objType){
	objType={};  // 這邊不單改屬性質,直接將objType直接賦值

}
myFunc(objA);
console.log(objA);

https://ithelp.ithome.com.tw/upload/images/20181015/20110579Kkrcrx04mn.png

傑克的煙抽完了,站起身道:「剛才的陣列也是如此」
夕陽無限好,只是近黃昏。

aaa=[1,2,3,4,5]
function myFunc(arrayType){
	arrayType=99; //這邊直接賦值

}
myFunc(aaa);
console.log(aaa);

https://ithelp.ithome.com.tw/upload/images/20181015/20110579i5dXZiSXX8.png

js 還真多神奇的機制呢!!
在此筆記一下。


上一篇
函數(3) 省略寫法及其中this 的轉指向
下一篇
函數(5) 三點式 的(reset)參數
系列文
一步一腳印-紮紮實實學es630

尚未有邦友留言

立即登入留言