闭包/递归

// 递归

    function faciorial(num) {
        if (num < 10) {
            return num;
        } else {
            // argument.callee是一个指向正在执行的函数,但是再严格模式下会报错。可以使用函数表达式的方式
            return arguments.callee(num) * 2
        }
    }
    
    // 使用函数表达式实现递归
    const faciorial1=(function f(){
        if (num < 10) {
            return num;
        } elsec {
            return f(num) * 2
        }
    })

    faciorial(2)
    faciorial1(2)
     /**
      * 闭包 一个函数可以访问另外一个函数的变量可以称为闭包,如何形成的闭包?为什么一个函数会可以访问另外一个函数的变量?
      * 这个从作用域链说起,当一个函数被创建时,会创建一个执行环境和对应的作用域链,然后使用arguments和其他命名的参数来初始化活动对象
      * 再作用域链里,外部函数的活动对象始终第二位,外部函数的外部函数的活动对象再第三位。
      * faciorial 函数第一层活动是他本身里面包含 num和arguments。第二层活动对象则是全局函数。一般函数在执行完毕后,活动对象会被销毁
      * 然而闭包不同。闭包会将他可以访问的函数的活动对象加到自己的作用域链中。闭包执行完毕,起活动对象不会被销毁,只有取消对闭包对象的引用,
      * 可以销毁闭包对象
      **/
      function createFunctions(){
          var result=new Array();
         for(var i=0;i<10;i++){
              result[i]=function(){
                  return i; 
              }
         }
         return result; // 返回10 因为每个函数的作用域链中都包含着createFunctions的活动对象。
      }
  
      // 改写可以返回0 1的
      function createFunctionss(){
          var result=new Array();
         for(var i=0;i<10;i++){
              result[i]=function(num){
                  return function(){
                    return num;
                  }
             }
         }(i)
         return result; 
      }

你可能感兴趣的:(闭包/递归)