函数的扩展
函数的默认值问题
- ES6允许为函数的参数设置默认值,直接写在参数定义的后面。参数变量是默认声明的,不能用let或const再次声明.例如:
funtion foo(x=5){
let x=1; ==>Error x已经作为参数声明了,不能再声明
}
- 参数默认值不是传值的,而是每次重新计算表达式的值,也就是惰性求值
let x=99;
function foo(p=x+1){
console.log(p)
}
foo(); ==>100
x=100;
foo(); ==>101
- 避免没有给参数赋值报错
function foo({x,y=5}={}){
console.log(x,y);
}
foo(); ==>undefined,5
- 设定默认值的参数应该是函数的尾参数。这样容易看出省略了哪些参数,如果非尾部的参数设置默认值,实际这个参数是没法省略的
function f(x=1,y){
return [x,y];
}
f(); ==>[1,undefined]
f(2); ==>[2,undefined]
f(,1);==>error
f(undefined,1); ==>[1,1] //这里必须严格传入undefined,默认值才会生效.其余地方同理
-
指定了默认值以后,函数的length属性将返回没有指定默认值的参数个数。但是如果设置默认值的参数不是尾参数,length属性也不会计入后面的参数.也就是返回从第一个参数开始到默认值参数位置的参数的个数
(function (a=0,b,c){}).length ==>0
(function (a,b=0,c){}).length ==>1 -
设置了参数的默认值之后,函数进行声明初始化时,参数会形成一个单独的作用域(context)。初始化结束后作用域就会消失
var x=1;
function(x,y=x){
console.log(y)
}
f(2) //2 调用时x默认指向第一个参数x,而不是全局x
let x=1;
function f(y=x){
let x=2;
console.log(y)
}
f() ==>1 调用时,y=x作为单独的作用域,因为参数中的x未定义,所以自动转到全局的x。函数体内的局部变量x不会影响默认值变量x,如果全局变量x不存在就会报错
箭头函数
- 箭头函数的好处就是能简化回调函数,让this指向固定化(函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象)
- 基本形式:
var f = v => v
,这个函数等价于var f=function(v) { return v; }
- 如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分.例如:
var f=()=>5
等价于var f=function(){return 5;}
- 如果箭头函数的代码块部分多于一条语句,就要使用大括号括起来,并使用return返回