函数扩展

一. 函数参数的默认值

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 未定义“。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值