es6函数扩展
程序员文章站
2023-12-22 12:25:40
...
-
函数参数指定默认值
// es5的写法 function(x,y){ y=y||'world'; console.log(x,y); } // es6的写法 function(x,y='world'){ console.log(x,y); }
-
参数解构
function foo({x, y=5}){ console.log(x,y) } foo() // undefine 5 foo({x:1}) // 1,5; foo({x:1, y:2}) // 1,2 foo() // error
-
函数的属性
-
length
(function(a){}).length //1 // length的属性返回值等于函数的参数个数减去指定的默认值的参数
-
-
name
let f=function(){}; //es5 f.name // '' //es6 f.name //'f'
-
作用域
// 一旦设定了参数的默认值, 函数声明进行初始化的时候, 参数会形成独立的作用域, 等到初始化结束, 这个作用域就会消失 var x=1; function f1(x, y=x){ console.log(y) } f1(2) //2 默认值变量x指向第一个参数x, 而不是全局的x let x=1; function f2(y=x){ let x=2; console.log(y) } f2() // 1
-
rest参数, 不需要指定参数的个数
function f1(...values){ let sum=0; for(let val of values){ sum +=val; } return sum; }
-
箭头函数
var f=()=>5; // 等价于 var f=function(){ return 5; }
-
尾递归
了解尾递归前, 首先要了解尾调用:某个函数的最后一步是调用另外一个函数
function f(x){ return g(x) }
如果函数尾调用自身, 就是尾递归, 递归是非常耗内存,因为需要同时保存成千上百个调用帧, 但是对于尾递归而言, 只存在一个调用帧, 所以不会发生溢出栈的错误
function factorial(n){ if(n===1) return 1; return n*factorial(n-1); } f(5) // 120; // 尾递归 function factorial2(n, total){ if(n==1){ return total } return factorial2(n-1, n*total); // 调用自身 }