将函数声明方式转化成表达式方式能够解决什么问题?

案例一:解决递归函数问题,下面用递进的方式演示

1 . 经典递归阶乘函数

   function factorial(num){
           if(num < 1){
            return 1;
        }else{
            return num * factorial(num-1);
        }
   }

2 . 如果执行如下代码会出现error: Uncaught TypeError: factorial is not a function ,原因是factorial已经不是函数了

   var anotherFactorial = factorial;
   factorial = null;
   console.log(anotherFactorial());

3 . 解决方案利用arguments.callee()代替函数名(一个指向正在执行的函数指针);

   function factorial(num){
           if(num < 1){
            return 1;
        }else{
            return num * arguments.callee()(num-1);
        }
   }

4 . 由于严格模式下, arguments.callee()方法是不支持的,故不能完全解决问题,这时候可以利用将函数声明方式转化成函数表达式的方式来解决问题

   var factorial = (function f(num){
           if(num <= 1){
            return 1;
        }else{
            return num * f(num - 1);
        }
   })

案例二解决不能动态编程(如果用function声明函数将导致函数提升,而函数提升导致不能动态编程),使用函数表达式可是实现动态编程

1 . 下面的这段代码是有问题的,不同的浏览器执行的结果是不同的

function control(condition){
    if(condition){
        function say(){
            console.log("hello")
        }
    }else{
        function say(){
            console.log("bye");
        }
    }    
}

2 . 如果非要有这种需求,可以使用如下方案

function control(condition){
    var say;
    if(condition){
        say = function (){
            console.log("hello")
        }
    }else{
        say = function (){
            console.log("bye");
        }
    }    
}
JSRUN notes