如果形參沒有被傳入對應的實參或者傳入了 undefined ,則該形參會被賦一個默認值。
描述
在 JavaScript 里,函數參數默認是 undefined 。然而,在某些情況下設置一個不同的默認值可能是有需要的。默認參數可以幫助解決這個問題。
過去,一般的設置默認參數方法是在函數體測試參數是否為 undefined,如果是的話就設置為默認的值。例如:
function multiply(a, b) {
b = typeof b !== 'undefined' ? b : 1;
return a*b;
}
multiply(5); // 5
有了默認參數,我們不需要再在函數體內做什么不必要的檢查。現在你可以在函數頭將b的默認值設置為1:
function multiply(a, b = 1) {
return a*b;
}
multiply(5); // 5
注:即使顯式地傳入了undefined,參數的值也會去默認值。
調用時解析
在函數被調用時,參數默認值會被解析,所以不像 Python 中的例子,每次函數調用時都會創建一個新的參數對象。
function append(value, array = []) {
array.push(value);
return array;
}
append(1); //[1]
append(2); //[2], not [1, 2]
這個規則對于函數和變量也是適用的。
function callSomething(thing = something()) { return thing }
function something(){
return "sth";
}
callSomething(); //sth
前置參數對于后面的默認參數是可見的
已經被聲明的參數對于后面的默認參數是可見的。
function singularAutoPlural(singular, plural = singular+"s",
rallyingCry = plural + " ATTACK!!!") {
return [singular, plural, rallyingCry ];
}
//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural("Gecko");
//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural("Fox","Foxes");
//["Deer", "Deer", "Deer ... change."]
singularAutoPlural("Deer", "Deer", "Deer peaceably and respectfully
petition the government for positive change.")
以下這個例子近似模擬了一些比較簡明的情況,并說明了特殊情況是怎么被處理的。
function go() {
return ":P"
}
function withDefaults(a, b = 5, c = b, d = go(), e = this,
f = arguments, g = this.value) {
return [a,b,c,d,e,f,g];
}
function withoutDefaults(a, b, c, d, e, f, g){
switch(arguments.length){
case 0:
a
case 1:
b = 5
case 2:
c = b
case 3:
d = go();
case 4:
e = this
case 5:
f = arguments
case 6:
g = this.value;
default:
}
return [a,b,c,d,e,f,g];
}
withDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
withoutDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
函數嵌套定義
在函數體內的函數聲明不能引用內部的默認參數,并會出現 ReferenceError 錯誤。默認參數總是會被首先執行,而在函數體內部的函數聲明會在之后生效。
函數呃逆定義的閉包對于默認參數是不能引用的,如果引用會報錯(“Reference Error”)。默認參數總是被最先解析,函數內部的聲明會在這之后被解析。
// Doesn't work! Throws ReferenceError.
function f(a = go()) {
function go(){return ":P"}
}
位于默認參數之后非默認參數
function f(x=1, y) {
return [x, y];
}
f(); // [1, undefined]