欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

es6函数扩展

程序员文章站 2023-12-22 12:25:40
...
  1. 函数参数指定默认值

    // es5的写法
    function(x,y){
        y=y||'world';
        console.log(x,y);
    }
    
    // es6的写法
    function(x,y='world'){
        console.log(x,y);
    }
    
  1. 参数解构

    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
    
  1. 函数的属性

    • length

      (function(a){}).length //1
      
      // length的属性返回值等于函数的参数个数减去指定的默认值的参数
      
  • name

    let f=function(){};
    //es5
    f.name // ''
    //es6
    f.name //'f'
    
  1. 作用域

    // 一旦设定了参数的默认值, 函数声明进行初始化的时候, 参数会形成独立的作用域, 等到初始化结束, 这个作用域就会消失
    
    
    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
    
    
  1. rest参数, 不需要指定参数的个数

    function f1(...values){
        let sum=0;
        for(let val of values){
            sum +=val;
        }
        return sum;
    }
    
  1. 箭头函数

    var f=()=>5;
    // 等价于
    var f=function(){
        return 5;
    }
    
  1. 尾递归

    了解尾递归前, 首先要了解尾调用:某个函数的最后一步是调用另外一个函数

    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);  //  调用自身
    }
    

上一篇:

下一篇: