a_gust_wind 2022-02-02 14:43 采纳率: 55.6%
浏览 37
已结题

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的值为什么不能设置了呢

  • 写回答

1条回答 默认 最新

  • Donp1 2022-02-02 16:11
    关注
    
        /* 有名函数 */
            function b() {
                //函数体
            }
            /* 匿名函数 */
            var a = function () {
                //函数体
            }
    

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

    img

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月2日
  • 修改了问题 2月2日
  • 创建了问题 2月2日

悬赏问题

  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题