文章目录
一. 函数参数的默认值
1. ES6设置默认参数
传参就使用传入的参数,
没有就使用默认参数
function show(a = 'hello', b = 'world') {
console.log(a, b)
}
show() // hello world
show('世界', '你好') // 世界 你好
4. 默认参数的位置
function f(x = 1, y) {
return [x, y];
}
f() // [1, undefined]
f(2) // [2, undefined])
f(undefined, 1) // [1, 1]
5. 结合对象解构赋值
function show({a = "欢迎",b = "无为"}){
console.log(a,b);
}
show({a:"welcome",b:"wuwei"}); // welcome wuwei
show({b:"wuwei"}); //欢迎 wuwei
show({}); // 欢迎 无为
// 但是这样就报错
function show({a = "欢迎",b = "无为"}){
console.log(a,b);
}
show(); // 报错
// 所以我们对象也得给一个默认值
function show({a = "欢迎",b = "无为"} = {}){
console.log(a,b);
}
show(); // 欢迎 无为
6. 函数的参数默认已经定义了,不能再用let,const声明
function show(age = 18){
let age = 20;
console.log(age);
}
show(); // 程序报错,age已经被定义过了
// Uncaught SyntaxError: Identifier 'age' has already been declared
二. 默认参数对函数length的影响
参数指定默认值后,length不会包含该参数
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
- fn.length 返回形参个数
- arguments.length 返回实参个数
三. 默认值与作用域
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
var x = 1;
function f(x, y = x) {//AO{x:2,y:2}
console.log(y);
}
f(2) // 2
上面代码中,参数y
的默认值等于变量x
。调用函数f
时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x
指向第一个参数x
,而不是全局变量x
,所以输出是2
。
let x = 1;
function f(y = x) { //AO{y:1,x:2}
let x = 2;
console.log(y);
}
f() // 1
上面代码中,函数f
调用时,参数y = x
形成一个单独的作用域。这个作用域里面,变量x
本身没有定义,所以指向外层的全局变量x
。函数调用时,函数体内部的局部变量x
影响不到默认值变量x
。
var x = 1;
function foo(x = x) { //AO{x:1}
// ...
}
foo() // ReferenceError: x is not defined
上面代码中,参数x = x
形成一个单独作用域。实际执行的是let x = x
,由于暂时性死区的原因,这行代码会报错”x 未定义“。