es6 有趣的知识点
1.尾调用优化(尾递归)
这就叫做“尾调用优化”(Tail call optimization),即只保留内层函数的调用帧。如果所有函数都是尾调用,那么完全可以做到每次执行时,调用帧只有一项,这将大大节省内存。这就是“尾调用优化”的意义。
// 情况一
function f(x){
let y = g(x);
return y;
}
// 情况二
function f(x){
return g(x) + 1;
}
// 情况三
function f(x){
g(x);
}
情况三就是尾调用,此处可以做尾调用优化。原因:g(x) 没有用到f(x) 定义的变量
注意:
ES6 的尾调用优化只在严格模式下开启,正常模式是无效的。
这是因为在正常模式下,函数内部有两个变量,可以跟踪函数的调用栈。
func.arguments:返回调用时函数的参数。 func.caller:返回调用当前函数的那个函数。
不在严格模式下如何实现尾递归的优化,防止堆栈溢出,将递归转换成循环
目前不是完全懂。。以后再看
2.spread 扩展运算符 ... rest
- 用于传参
- 用于伪数组,转数组