一道面试题告诉了我函数在块级作用域中的提升并没有那么简单(1)



{

	function foo() { }

	foo = 1;

}

console.log(foo);



最终的打印结果是:ƒ foo() { } 所以你猜对了吗 [手动狗头]

1.1 题目1 解题思路


{

    console.log(window.foo, foo) // undefined        ƒ foo() { }

    function foo() { }

    console.log(window.foo, foo) // ƒ foo() { }      ƒ foo() { }

    foo = 1;

    console.log(window.foo, foo) // ƒ foo() { }      1

}

console.log(foo);   // ƒ foo() { }



没错,你没看错,就是粗暴的用 console 对此我只想说,没有什么事 console 解决不了 如果有,那就多写几个 [二次手动狗头]

  • 下边我们来一步一步分析

    • 第一行,打印 undefined ƒ foo() { } 说明此时,函数声明提升到了块级作用域顶部,但没有挂载到全局

    • 第二行,function foo() { } 实际执行时,会有一个隐式操作,将当前 foo 的值,同步给 window

      • 通过 第一行打印结果可以得出,此时 foo 为 ƒ foo() { }
    • 第三行,打印 ƒ foo() { } ƒ foo() { } 说明此时,函数已经被挂载到全局,且在第二行执行了上述的隐式操作

    • 第四行,foo = 1,此时修改的是 块内的 foo,与外部 window 无关

    • 第五行,打印 ƒ foo() { } 1 印证上一行言论

    • 最后一行,打印 ƒ foo() { }

2. 题目2



{

    function foo() { }

    foo = 1;

    function foo() { }

}

console.log(foo);



最终的打印结果是:1 所以你又猜对了吗 [还是手动狗头]

2.1 题目2 解题思路


{

    console.log(window.foo, foo)    // undefined        ƒ foo() { }

    function foo() { }

    console.log(window.foo, foo)    // ƒ foo() { }      ƒ foo() { }

    foo = 1;

    console.log(window.foo, foo)    // ƒ foo() { }      1

    function foo() { }

    console.log(window.foo, foo)    // 1 1

}

console.log(foo);   // 1



没错 console.log YYDS [重复手动狗头]

  • 下边我们来一步一步分析

    • 第一行,打印 undefined ƒ foo() { } 说明此时,函数声明提升到了块级作用域顶部,但没有挂载到全局

    • 第二行,function foo() { } 实际执行时,会有一个隐式操作,将当前 foo 的值,同步给 window

      • 通过第一行打印结果可以得出,此时 foo 为 ƒ foo() { }
    • 第三行,打印 ƒ foo() { } ƒ foo() { } 说明此时,函数已经被挂载到全局,且在 第二行执行了上述的隐式操作

    • 第四行,foo = 1,此时修改的是,块内的 foo,与外部 window 无关

    • 第五行,打印 ƒ foo() { } 1 印证上一行言论

    • 第六行,function foo() { } 实际执行时,会有一个·隐式操作·,将当前 foo 的值,同步给 window

      • 通过第五行行打印结果可以得出,此时 foo 为 1
    • 第七行,打印 1 1

    • 最后一行,打印 1

3. 题目3



{

    function foo() { }

    foo = 1;

    function foo() { }

    foo = 2;

}

console.log(foo);



最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值