《js高程3》4.1.3中:ecmascript中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製為函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。
正如書中所說,「有不少開發人員在這一點上可能感到困惑」,很不幸,我就是那一部分人。
本文一是看高程整理的筆記,另一方面是自己有很多不理解的地方,望理解的可以解開我的困惑。
以下內容紅色部分為是我自己內心yy,就是我理解有偏差的地方,如果懶得看文章,這直接看紅色文字。
先複習下js中複製變數值
ecmascript變數包含兩種不同的資料型別,
複製基本型別
會開闢乙個新的記憶體空間,將值複製到這個新的記憶體空間
複製引用型別當從乙個變數向另乙個變數複製引用型別的值時,同樣也會將儲存在變數中的物件中的值複製乙份到為新變數分配的空間中。不同的是,這個值的副本實際上是乙個指標,而這個指標指向儲存在堆中的乙個物件。
var obj1 = {};
var obj2 = obj1;
obj2.name = '張三';
重點來了,以下高程這個章節沒有講
var obj1 = {};
var obj2 = obj1;
obj2.name = '張三';
ecmascript中所有函式的引數都是按值傳遞的。這句話令我非常困惑。最後在說**困惑。請繼續看。
基本型別傳遞
在向函式引數傳遞基本資料型別的值時,被傳遞的值會被複製給乙個區域性變數。
var num1 = 1;
var result = addten(num1);
function addten(num)
console.log(num1,result)//1,11
這裡,函式addten有乙個形參num,實際上是函式的區域性變數,呼叫函式時,變數num1作為引數傳遞給函式的形參num,這個過程是就是上面的複製基本型別,所以num1與函式區域性變數num互不影響引用型別傳遞js高程p70,在向引數傳遞引用型別的值時,會把這個值在記憶體中的位址複製給函式區域性變數。wtf,這不就是按引用傳遞麼-_-
var person = {};
setname(person);
function setname(obj)
}console.log(person)//
對於這段**,高程的原文是
在這個函式內部,obj和person引用的是同乙個物件,換句話說,即使這個變數按值傳遞的,obj也會按引用來訪問同乙個物件
上面**的執行結果很容易接受,但是原文這個說法很難接受。
1.既然引用的同乙個物件,那麼傳遞的就是位址,這不就是按引用傳遞麼。
2.如果要說傳遞位址這個過程 可以理解為按值傳遞(將儲存的位址傳遞),那麼引用型別的複製,都可以說是按值傳遞(將儲存的位址傳遞)了,就不存在基本型別與引用型別這個概念了。 感覺雙標了。。
原文為了論證繼續函式是按值傳遞的,補加了下面這個例子。
var person = {};
setname(person);
function setname(obj);
obj.name = '李四';
console.log(obj)//
}console.log(person)//
原文:如果person是按引用傳遞的,那麼person就會自動修改為指向其name屬性值為』李四』的新物件。
我認為這個論證沒有到點上,上面複製引用型別那段藍色文字跟這個不是一樣的麼
所以我現在急需解決的問題就是
按值傳遞,按引用傳遞的真正概念到底是什麼,網上還有一種說法說這個是按分享傳遞。
是不是我理解尼古拉斯.澤卡斯所說的這部分內容有問題。
未完,如果問題解決會補充。
JS 把函式作為引數傳遞
昨天同事問了我乙個挺有意思的問題,就是js如何把函式當作引數傳進另乙個函式中執行,上網找了乙個並做乙個總結,目前我能理解並正常使用的兩種方法 方法一 func 方法名 str 引數 function test1 func,str else function test2 str 方法二 functio...
JS引數傳遞
基本資料型別的傳遞 function changenum num function changestr str 作為引數傳遞的變數不因為引數值的改變而改變 let num 2 let numret changenum num console.log num,numret 2 3 let str he...
js 傳遞引數
ecmasscript中所有的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。基本型別值得傳遞如同基本型別變數的複製一樣,二引用型別值得傳遞,則如同引用型別變數的複製一樣。function setname obj obj.name nicho...