《你不知道的JavaScript》阅读疑惑之if块内的函数声明,if语句块内的函数,if语句外也可以访问

大家好,我是小梅,公众号:「小梅的前端之路」 原创作者。

作为在前端领域不断探索的一员,在此记录开发中遇到的问题,如果你也遇到了相同的问题,希望本文对你有帮助。


最近在看《你不知道的JavaScript》

遇到一个下面的问题

var b = true;
console.log(typeof foo);
if (b) {
    console.log(11, typeof foo);
    function foo() {
        console.log('b')
    }
    console.log(22, typeof foo);
} else {
    console.log(33, typeof foo);
    function foo() {
        console.log('not b')
    }
    console.log(44, typeof foo);
}
console.log(55, typeof foo);
foo();

结果震惊到我了,在node环境中运行上面代码,结果如下:

undefined
11 function
22 function
55 function
b

本来以为这个foo()会运行报VM294:1 Uncaught ReferenceError: foo is not defined错的来着,毕竟函数声明看起来是声明在块级作用域。但为啥一开始会输出foo的类型是undefined,后面又是function类型。

后来看了《你不知道的JavaScript》,书中讲到,在普通的块级作用域中的函数声明会被提升到当前所在作用域的顶部(此处就是全局作用域),因此后面执行foo()的时候可以正常的输出。

但为啥一开始判断foo的类型却是undefined?

对此,参照其他博客,得出结论如下:

1、无论if是否执行执行,if块级作用域内的函数声明都会被提升,提升至当前所在作用域的顶部。只是这时提升的变量foo的值是undefined,而不是函数体。

2、当执行到if内部的函数声明时,变量foo被赋值为函数体。此时11 处判断foo的类型就是function。

3、因为变量foo已经被提升到全局作用域了,因此foo()可以正常执行。


这种奇奇怪怪的代码,开发中千万不要写,毕竟这个行为可能在各个浏览器的表现不一样。一定要避免在块内部声明函数。

❤️欢迎素质三连[点赞 + 收藏 + 评论]

我是小梅,有兴趣的话可以在微信搜一搜「小梅的前端之路」第一时间接收文章更新通知,一起沟通、学习成长呀。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值