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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀