es6 函数改变
- 可以为函数定义默认参数,在es6之前,可能需要在函数体内添加额外的代码来检查参数是否存在,如若不存在,则需要手动赋一个默认值。
- 也可以为函数定义不定参数,这个数组中包含其后所有的参数,由于使用的是真实数组,且可以根据需要决定要囊括到数组中的参数,因此不定参数是一个比arguments对象更灵活的解决方案。
- 展开运算符与不定参数形似,可以通过它解构数组,并将每一个元素作为函数的第一参数使用。在es6之前,要手动指定每一个参数或使用apply()方法
- 函数中新增的name 属性。es6也定义了块级函数的行为,即使在严格模式下块级函数也不再是一个语法错误
- es6中,普通的函数会触发函数的[[call]]方法调用,通过new关键字调用函数会触发函数的[[constructor]]方法调用。新增的元素属性new.target可以帮助你检测函数是通过何种方式调用的
- es6在函数方面最大的改变是添加了箭头函数。箭头函数的设计目标是替代匿名函数表达式,它的语法更简洁,具有词法级的this绑定,没有arguments对象,函数内部的this值不可改变,因此不能作为构造函数
- 尾调用指的是函数作为另一个函数的最后一条语句被调用。尾调用优化可以帮助函数保持一个更小的调用栈,从而减小内存的使用,避免栈溢出错误。当程序满足优化条件时,引擎会自动对其优化。当然,你可能希望重写递归函数,从而使引擎更好地优化你的程序.
尾调用优化的条件:
1. 尾调用不访问当前栈的变量(也就是函数不是一个闭包)
2. 在函数内部,尾调用是最后一条语句。
3. 尾调用的结果作为函数值返回。
function doSomething(){
return doSomethingElse(); //尾调用
}
function doSomething(){
doSomethingElse();//无法优化,无返回
}
function doSomething(){
return 1 + doSomethingElse();//无法优化,必须在返回值后不添加其他操作
}
function doSomething(){
var result = doSomethingElse();
return result;//无法优化,调用不在尾部
}
function doSomething(){
var num = 1,
func = () => num;
//无法优化,该函数是一个闭包
return func();
}
//一般用在递归里面
function factorial(n){
if (n <= 1){
return 1;
} else {
//无法优化,必须在返回后执行乘法操作
return n * factorial(n - 1);
}
}
//一般用在递归里面
function factorial(n, p = 1){
if (n <= 1){
return 1 * p;
} else {
//可以优化
let result = n * p;
return factorial(n - 1, result);
}
}