参考以下博客,建议查看原博客,它更为详细;
ES6 阮一峰
参数的默认值
可以为函数的参数设定默认值;
function a (b=5){
console.log(b);
}
a(); //5
a(1); //1
上面的代码意思为;如果函数a被调用时,掺入了参数,那么参数b=传入的参数;如果没有传入参数,那么参数b=5;
注意参数是默认被声明的,不允许重复声明;
function a (b=5){
let b = 'xyd';
console.log(b);
}
a(); //报错
a(1); //报错
函数a的参数 b已经被默认声明过,let b时,就会报错;(var是可以,let和const都不允许重复声明变量);
函数的参数名不允许重复;
function a (a,b,b){
console.log(a,b,b);
}
a(1,2,3); //报错
如果函数的参数默认值是一个变量,当调用函数时,就是重新计算参数默认的值;
if(true){
let y = 1;
function a(x=y+1){
console.log(x)
}
a(); //2
y = 2;
a();//3
}
上面的代码: 函数a的参数 x 的默认是 y+1,而y是一个变量;当调用a时,它的参数x的默认就会重新计算,而不是默认为2( y+1 =2);
所以第一调用时x = 2;
第二次调用时,这时的y=2;y+1=3;所以运行结果是3;这表示如果函数的参数默认值是一个变量,当调用这个函数时它的参数默认值就会重新计算;
函数参数与解构赋值,默认值
与对象解构赋值
function xyd({a,b}={a:1,b:2}){
console.log(a,b)
}
xyd({a:5, b:6}); //5,6
xyd({a:4}); //4,undefiend
xyd({}) // undefiend,undefiend;
xyd() //1,2
这里的函数参数的默认值是一个具体的对象属性,没有使用对象解构赋值的默认值;
xyd ( {a:5, b:6 } ); a被赋值为5,b被赋值为6;
xyd ( {a:4 } ); a被赋值为4,这里的参数a和b都是对象解构赋值,b没有解构成功,undefiend;
xyd( { }); 传入了一个空对象,这里a和b都没有解构成功;undefiend;
xyd( ); 执行 {a,b}={a:1,b:2} ,解构成功,//1,2
与对象解构赋值的默认值,与上面的区别是,它设置了对象解构赋值的默认值;
function xyd({a=1,b=2} = {} ) {
console.log(a,b);
}
xyd(); //1,2 没有传值;a和b的默认值为1,2
xyd({}); //1,2 传入一个空对象,因为设置了解构对象赋值的默认值,所以这里a=1,b=2;
xyd({a:3});//3,2 只传入了a,b因为设置了解构对象赋值的默认值,所以b=2;
xyd({a:5,b:6}); //5,6 a和b赋值
函数参数的默认位置
如果设置了函数参数的默认值,它应该在函数参数的尾部,这样也容易看出省略了哪些参数;
如果设置了函数参数的默认值,不是在函数参数的尾部,那么这个参数在调用时,就无法被省略;
function xyd(x=1,y){
console.log(x,y);
}
xyd(,2)//报错,不能省略参数x;
## 函数的Length ##
h函数的Length 返回函数参数的长度;注意:如果参数设定了默认值,那么length将不包含这个参数;
console.log((function (a,b){}).length); //2
console.log((function (a,b=1){}).length)//1,参数b设定了默认值,length不将不会包含它;
## 参数的作用域 ##
z当实行函数时,它的参数就会形成以个单独的作用域;
var x='xyd';
function xyd(x=1,y=x){
console.log(y);
}
xyd();//1;
当运行函数xyd()时,参数形成了一个单独的作用域;y指向参数x(x=1),
而不是指向var x=’xyd’
var x = 1;
function xyd(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo(); //3
console.log(x);//1
上面的函数xyd运行时,它的参数形成了自己的作用域,参数y的默认值函数中x指向了参数x,而xyd函数内部又声明了一个变x,当运行y时,由于它的x指向的是参数x,参数形成了自己的作用域,修改的是参数x的值,而不是xyd函数内部声明的x,所以运行结果是3;
而在函数xyd()外面打印的x指向是var x= 1;所以这里的打印结果是1;
如果把函数xyd()内部声明的变量x去掉,这时候打印的x就是参数y中赋值的变量x=2;也就是参数x;运行y后,参数x的值为2;打印结果为2;
var x = 1;
function xyd(x, y = function() { x = 2; }) {
y();
console.log(x);
}
foo(); //2
console.log(x);//1