在 JS 里函數(shù)是一等公民
理解函數(shù)參數(shù)
定義一個(gè)函數(shù) test
function test(arg1, arg2) {
console.log("Hello " + arg1 + " " + arg2);
return "Hello " + arg1 + " " + arg2;
}
test 函數(shù)有兩個(gè)參數(shù),但是這兩個(gè)參數(shù)可傳可不傳沟启,函數(shù)都不會(huì)報(bào)錯(cuò)。
這是因?yàn)?ECMAScript 中的參數(shù)在內(nèi)部是用一個(gè)數(shù)組表示的噩咪,函數(shù)接收到的始終都是這個(gè)數(shù)組羽戒,而不關(guān)心這個(gè)數(shù)組中有沒(méi)有元素,有多少個(gè)元素塘偎。實(shí)際上疗涉,在函數(shù)內(nèi)部可以通過(guò) argumnets 對(duì)象來(lái)訪問(wèn)參數(shù)數(shù)組,從而獲取到函數(shù)的參數(shù)吟秩,所以上面的函數(shù)也可以改寫(xiě)為
function test() {
console.log("Hello " + arguments[0] + " " + arguments[1]);
return "Hello " + arguments[0] + " " + arguments[1];
}
利用 arguments JS 可以模擬重載
function doAdd() {
if (arguments.length === 1) {
console.log(arguments[0] + 10)
} else if (arguments.length === 2) {
console.log(arguments[0] + arguments[1])
}
}
ECMAScript 中所有參數(shù)都是值傳遞咱扣,不可能通過(guò)引用傳遞參數(shù)
1.當(dāng)參數(shù)是基本數(shù)據(jù)類(lèi)型時(shí),被傳遞的值會(huì)被復(fù)制給命名參數(shù)涵防,或者說(shuō)復(fù)制給 arguments 對(duì)象中的一個(gè)元素
function add (num) {
num += 10
return num
}
var count = 20
var result = add(count)
console.log(count)
console.log(result)
可以看到闹伪,當(dāng) count 傳遞到函數(shù)內(nèi)部進(jìn)行運(yùn)算之后,count 的值并沒(méi)有發(fā)生改變,說(shuō)明 num 和 count 并沒(méi)有什么關(guān)系偏瓤,只是具有相同的值杀怠。
2.當(dāng)參數(shù)為引用類(lèi)型值的時(shí)候,可能會(huì)造成一些困惑
var person = {}
function setName(obj) {
obj.name = 'John'
}
setName(person)
console.log(person)
看到這個(gè)結(jié)果可能就任務(wù)引用數(shù)據(jù)類(lèi)型參數(shù)是按照引用傳遞的厅克,但是把這個(gè)函數(shù)稍微做下改造
var person = {}
function setName(obj) {
obj.name = 'John'
obj = {}
obj.name = 'alex'
}
setName(person)
console.log(person)
如果參數(shù) obj 是按引用傳遞的赔退,那么在函數(shù)的第二行,引用被指向了一個(gè)新對(duì)象证舟,那么當(dāng)再次打印 person 時(shí)硕旗,打印的應(yīng)該是 name 為 alex 的對(duì)象,但是結(jié)果卻不是女责,這說(shuō)明卵渴,當(dāng)參數(shù)是引用類(lèi)型時(shí),實(shí)際上是把引用類(lèi)型對(duì)象在棧內(nèi)存中的指針復(fù)制了一份傳遞給函數(shù)