关于块作用域的一道面试题

464 阅读1分钟

问题

最近遇到一道面试题,简单可以理解为

{
    function a () {}
    a = 1
}
console.log(a)
// 打印 ƒ a () {}

这个是不符合我的认知的,因为 ES6 之后,使用 let const 和函数声明都是应该有块作用域的。 但是这里很明显块作用域没有生效。而且更诡异的是,如果说块作用域没有生效,那也应该打印 1 而不是 f a () {}

原因

经过几番测试和搜索,在这里找到可以解释的答案。上述代码可以理解为

var a = undefined
{
    var _a = function () {}
    a = _a
    _a = 1
}
console.log(a)

有几点需要注意的

总结

使用 'use strict',远离这种诡异事件