es6函数
1.默认参数
默认参数导致函数在执行时,先执行参数体,再执行函数体
2.箭头函数
无法使用arguments,可通过获取剩余参数的语法代替
不能做构造函数
作用域是定义时的作用域,箭头函数不受严格模式影响,如果要修改其作用域,将其放到普通函数里
箭头函数不能做generator,内部不能使用yeild关键字
let demo = (...args) => {
console.log(args)
}
3.尾调
定义:在一个函数里面返回另一个函数结果
运行子函数时,没有任何与父函数产生联系的数据(会删除父函数),所以可以尾调函数优化
闭包不能是尾调
// 子函数 function ickt(){ console.log('ickt') } // 函数 function demo(){ return ickt() }
4.尾递归和蹦床函数结局堆栈溢出问题
// 尾递归-累加 function add1(n,total){ if(n === 1){ return 1 + total } return add(n-1,n+total) } console.log(add1(10000)) // 蹦床函数-累加(一次又一次更换函数名称,防止堆栈溢出) function trampoline(f){ while(f && typeof f === 'function'){ // 执行但不返回 f = f() } // 返回结果 return f } function add2(n,total=0){ if(n === 1){ return 1 + total } return add2.bind(null,n-1,n+total) } console.log(trampoline(add2(100000)))