传参就使用传入的参数, 没有就使用默认参数
function show(a = 'hello', b = 'world') { console.log(a, b) } show() // hello world show('世界', '你好') // 世界 你好参数指定默认值后,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 未定义“。