ES6 函数参数的默认值 疑惑 5C

图片说明

为什么在外面使用var就会报错?在里面就不会报错?

 function fn(x=8){
  var x = 89;
  console.log(x);//不报错
}
fn();
let y = 7;
var y = 8;//报错

4个回答

函数的参数相当于var 出来的变量,var重复定义不会报错

Elasticsearch顶尖高手系列

形参就相当于是 var x=5了,var过的变量是不能重复定义的

jerryyang_2017
杨家八公子 回复xyt3198: 我又咋了,不喜勿喷
接近 2 年之前 回复
xyt3198
xyt3198 阅读理解0分的就是你了
接近 2 年之前 回复

函数的参数等同用var声明的变量。
let 和 const 不能对同一作用域中已经存在的变量重复声明。重复声明会报错。
var对变量重复声明不会报错,但第一次之后的声明会被自动忽略。

在ES6之前,不能直接为函数的参数指定默认值,只能采取变通的方法。

function log(x,y){
y = y||'world';
console.log(x,y);
}
log('kkk');//kkk world

这种写法的缺点在于:
如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。如果在调用函数的时候,传入的y参数是一个空字符串,那么y就会被修改为默认值。
避免这个问题,需要先判断一下:1.通过判断值是否等于undefined,2.判断arguments.length是否为1.

但是ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。

function log(x,y='world'){
console.log(x,y);
}
log('hello'); //hello world

ES6语法的好处:
1.简洁
2.阅读代码的人可以看出哪些参数是可以省略的,不用查看函数体或文档
3.有利于将来的代码优化,即使未来的版本即使拿掉这个参数,以前的代码也可以运行
还有参数变量是默认声明的,不能在函数体内部再进行声明。

与解构赋值默认值结合使用
这里有两种写法需要区分一下:

function m1({x=0,y=0} = {}){
return [x,y];
}
function m2({x,y} = {x:0,y:0}){
return [x,y];
}
m1({x:3});//[3,0]
m2({x:3});//[3,undefined]
m1({});//[0,0]
m2({});//[undefined,undefined]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问