大家好,我是小梅,公众号:「小梅的前端之路」 原创作者。
作为在前端领域不断探索的一员,在此记录开发中遇到的问题,如果你也遇到了相同的问题,希望本文对你有帮助。
最近在看《你不知道的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()可以正常执行。
这种奇奇怪怪的代码,开发中千万不要写,毕竟这个行为可能在各个浏览器的表现不一样。一定要避免在块内部声明函数。
❤️欢迎素质三连[点赞 + 收藏 + 评论]
我是小梅,有兴趣的话可以在微信搜一搜「小梅的前端之路」第一时间接收文章更新通知,一起沟通、学习成长呀。