console.log(a) // undefined{ a = 0 function a () {} a = 1}console.log(a)
常规解释
- 根据阮一峰教程解释
![OR41)]%({2}LTW~@B){E4{K.png](/uploads/projects/neijuan@ptsoap/96af096ad57ac793000f307005c49961.png)
- 上面那种解释其实是有点不正确的
var a = 0;if (true) { console.log(a, window.a) // function a () {} 0,提升仍然存在 a = 1 console.log(a, window.a) // 1 0,a = 1 赋值了块级作用域内的 a function a () {} console.log(a, window.a) // 1 1,非严格模式下上面那句函数声明将块级作用域里的 a 赋值给了外面 a = 21 console.log(a) // 21}console.log(a) // 1
如果还觉得不过瘾,可以这么玩:let _a = 0;Object.defineProperty(window, 'a', { get() { return _a }, set(val) { console.log('set a =', val) _a = val }, enumerable: true, configurable: true})eval(`if (true) { console.log(a, window.a) // function a () {} 0 a = 1; console.log(a, window.a) // 1 0 function a () {} // set a = 1,没错这玩意能触发 setter…… console.log(a, window.a) // 1 1 a = 21; console.log(a, window.a); // 21}console.log(a); // 1`)
知乎上面的解释
https://www.zhihu.com/question/433134533
https://www.zhihu.com/question/404772996/answer/1329363707