js 函数赋值表达式var f1=(fucntion f(){}) 全局访问不到f


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <p>我在哪  是谁   是  </p>
        <script type="text/javascript">
        var f1 = (function f(num){
            console.log(f,'---');
             f=null;
            console.log(f)//f的值没变 相当于configurable设置为了false变成了个常量
            if(num<=1){
                
                
                return 1
            }
            return num*f(num-1)
            
        })//这里的括号加不与不加结果一样
        f1(1);//这里执行函数内部可以访问到f变量
        f(1)//这里执行报错 Uncaught ReferenceError: f is not defined
        
        
        </script>
    </body>
</html>

为什么f会变成局部变量了 而不是全局 f的值为什么不能设置了呢


    /* 有名函数 */
        function b() {
            //函数体
        }
        /* 匿名函数 */
        var a = function () {
            //函数体
        }

一般的函数定义分为有名函数和匿名函数,二者区别在var上的作用域提升。
看题主的写法,是混用了两种定义方式,js引擎在检测到有名函数时便会而外创建一个Window对象上的属性b来指向所写的有名函数的函数名,而匿名函数则是创建用户所指定的变量名a。但当两种命名都存在时,我认为计算机检测到了var a之后便直接创建函数指向Window.a,而不再创建额外的变量Window.b。类似于自调用函数在内部可以通过函数名调用,而外部则访问不到函数。

img

以上为Window对象的部分截图,我们可以看到Window对象上存在属性f1,函数的名字f还是存在的。但是没有额外创建Window对象的属性f。
这是我的理解,希望可以给你提供到一点思路上的帮助。