ES6在函数上做出了一些改进,相比于ES5显得更加的灵活。
ES6允许给函数参数设置默认值
function ff(x, y = "word") { // 设置默认值 不能再用let 和 const 继续声明
console.log(x + y);
}
ff("hello "); // hello word
ff("hello ", "China"); //hello China
可以给形参设置默认值,因此传参的时候,可以不给y传参。当形参y没有接受到值的时候,就取默认值,如果有值的时候就取实参的值。
而在ES5中是不能给形参设置默认值的!
那这样做有什么好处呢?
① 有利于代码优化 ② 就算调用没有传参也不会出错
函数的length属性
返回没有指定默认值的参数个数,当碰到指定默认值后,length属性将失真 就算后面有其他参数也不会计算进去。
console.log((function(x , y=1, z){}).length); //输出1
也就是说只将参数x计算进去。
函数的参数作用域
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
因为x有实参传进来,所以x取实参的值,参数y的默认值是x,当x有值传进来的时候,也给y赋值了。
而上面x没有实参传进来,所以取全局变量的x,因此y输出等于1。
函数的默认的参数值
为什么两个输出不一样?因为第一个foo函数里面重新定义了x,所以此时与形参x,形参y匿名函数里面的x不是同一个作用域。
而第二个foo函数没有重新定义x,所以函数里面的x取的是形参的x,因此y执行完函数以后重新给x赋值。
变量作用域链:函数内部>实参>默认值>全局
函数的rest参数设置
引入rest参数(形式为 …变量) 用来获取多余参数 rest参数是一个真正的数组。而在ES5中需要用document类数组来获取。很明显ES6的更加方便。
function test (a,...rest){
console.log(a); //盲僧
console.log(rest); //["永恩","亚索","刀妹","vn"]
}
test("盲僧","永恩","亚索","刀妹","vn")
…会将剩下的参数放到一个数组里面,而这个数组也是Array类型,非常方便,但是参数rest后面不能再出现参数。
函数的严格模式
从ES5开始,函数内部可以设定为严格模式。而ES6中,如果参数设置了默认值、解构赋值、扩展运算符,就不能设定严格模式,否则会报错。