聲明:本文就前兩天學習的 javascript函數(shù),傳參方式進行筆記倔既;
1.按值傳遞
當js函數(shù)的參數(shù)是基本數(shù)據(jù)類型時封豪,當調(diào)用方法時傳入的是一個數(shù)值佛点;也就是說 僅僅是把值給了這個方法瓢娜,在這個方法中改變挂洛,重新賦值都不會改變方法外邊的全局變量;
代碼如下:
理解:num變量實際上實在方法add中聲明的眠砾,只在add方法這個作用域內(nèi)有效抹锄,調(diào)用方法時,只是復(fù)制了一份相同的值給了num荠藤,方法內(nèi)不管發(fā)生什么伙单,和方法外界沒有任何關(guān)系;所以這叫按值傳遞哈肖;
2.共享傳遞
當函數(shù)的參數(shù)是引用數(shù)據(jù)類型時吻育,調(diào)用方法時,參數(shù)傳遞方式為共享傳遞——傳遞的是實參的地址拷貝淤井;先看現(xiàn)象:
注意:在方法中添加屬性name改變了外部變量person的屬性布疼,but,币狠,游两,在方法中重新new一個對象,卻沒有改變外部變量漩绵;這對理解會造成一個困惑贱案;一部分人認為它是按值傳遞的;那么obj.name = "Bob"卻能改變外部屬性止吐?還有一部分人認為是按引用傳遞的宝踪,那么當給它重新賦值時,引用應(yīng)該指向新的變量碍扔,但是并沒有瘩燥;
理解:共享傳遞實際上傳遞的是,外部變量的引用拷貝不同,注意是拷貝哦厉膀,ok,如此這樣二拐,你用這個拷貝來的引用去改變外部變量的內(nèi)部屬性服鹅,沒問題,可以成功卓鹿,but菱魔,留荔,吟孙,如果你直接新創(chuàng)建一個對象給它澜倦,并不影響外部變量,只是將該拷貝來的引用變了杰妓,而且藻治,方法一調(diào)用完畢,都會當作垃圾回收巷挥;
arguments
但是在方法內(nèi)部桩卵,若使用argumentts[0] = {name:"kanda" }這樣的字段去改變參數(shù),結(jié)果會發(fā)生什么倍宾?
事實證明雏节,arguments和應(yīng)該使用一個引用,但是他們不回改變外部變量的引用高职;