函数参数默认值设置
js
function foo(a,b=1,c=2){
console.log(a,b,c);
}
foo(1,null,undefined);//1,null,2
默认值只有在参数传递undefined,或者不传(不传就是undefined)时候才会使用默认值。
由于上面给c传递undefined,所以会使用默认值。而给b传递null是可以成功的。
arguments
如果给参数赋值默认值,那么在函数内部修改了参数后,arguments内部的值也不会改变。如果没写默认值,或者不是严格模式,那么修改相应的参数,arguments相应也是会改变的。
不赋值默认值情况,改变函数参数
js
function fn(a, b ) {
console.log(arguments[1]);//4
b = 111;
console.log(arguments[1]);//111,会改变arguments的值
}
fn(1, 4);
赋值默认值情况,改变函数参数值
js
function fn(a, b = 3) {
console.log(arguments[1]);//4
b = 111;
console.log(arguments[1]);//4,不会改变arguments
}
fn(1, 4);
函数在严格模式下面,情况也会跟设置了参数默认值的情况一样 例如:
js
function fn(a, b) {
"use strict";
console.log(arguments[1]); //4
b = 111;
console.log(arguments[1]); //4,不会改变arguments
}
fn(1, 4);
所以如果没有严格模式,也没有设置b的默认值,那么b在函数内部修改会改变arguments的值。
函数的length值
在没有给函数参数赋值默认值时,调用函数的length会返回函数的参数个数
js
function fn(a, b, c) {}
console.log(fn.length); //1
如果给一个函数参数赋值默认值,那么使用length计算函数的参数个数时,会返回这个函数设置默认值的那个参数前的参数个数,例如下面
js
function fn(a,b=1,c){}
console.log(fn.length);//1
function fn(a,b,c=1){}
console.log(fn.length);//2
默认值表达式
默认值表达式只有函数被调用,且用到这个默认值才会进行计算
js
let num = 1;
function fn() {
return num++;
}
function foo(a, b = fn()) {
console.log(a, b);
}
foo(1, 2);//1 2
foo(1);//1 1 //这里开始fn才会调用
foo(1);//1 2
函数参数的暂时性死区
js
function mul(num) {
return num*2;
}
function foo(a, b = mul(a)) {
console.log(a, b);
}
foo(1);//1 2
函数参数赋值的过程类似于下面这样
js
let a=1
let b=mul(a);
再看看下面的例子,如果调换了a和b的位置
js
function foo(b = mul(a),a) {
console.log(a, b);
}
foo(undefined,1)//报错
上面参数赋值过程类似于下面,由于b还没声明所以会报错
js
let a=mul(b);
let b=1;