这是 ES6 中引入的一个有趣的新特性。箭头函数,顾名思义就是一种使用箭头(=>)定义的新语法,与传统函数的差别如下:
箭头函数的语法:
- //加法
- var add = function(a,b){
- return a+b;
- }
- var sum = (a,b)=>a+b;
-
- //排序的比较器
- var result = values.sort((a,b)=>a-b);
其中箭头函数的参数为 ( => )左边括号的内容,右边为返回值。
尾调用优化是ES6引擎的优化。之前的循环调用中,每一个未用完的栈帧都会被保存在内存中,当调用栈变得过大时程序会出现问题,例如爆栈。
尾调用优化就是指函数作为另一个函数的最后一条语句被调用。
- function doSomething(){
- return doSomethingElse();//尾调用
- }
尾调用优化没有明确的语法,而是符合条件会自动优化。
在ES6中如果满足以下条件,尾调用不再创建新的栈帧,而是清楚并重要当前栈帧。(因为在ES5之前需要)
好处:
尾调用可以帮助函数保持一个更小的调用栈,从而减少内存的使用,避免栈溢出错误,当程序满足条件时,引擎会自动对其优化。
- function factorial(n,p=1){
- if(n<=1){
- return 1*p;
- }else{
- let result = n*p;
- //优化后
- return factorial(n-1,result);
- }
- }
无法优化的示例:
- "use strict"
- function doSomething(){
- //调用不在尾部无法优化.
- var Result = doSomethingElse();
- return Result;
- }
-
- function doSomething2(){
- var sum =1;
- fun = () =>num;
-
- //无法优化,闭包
- return func();
- }
尾调用优化和函数的懒执行有异曲同工之妙,典型的案例就是斐波拉契数列。把时间复杂度从 N^2 下降到 N