先直接抛出问题:
- 以下代码报错,求解该怎么具体分析这个错误发生的原因?
(目测是受 ES6 块作用域 TDZ 的影响在 编译阶段 抛出的问题)
{ var foo = 1; // 该句报错,“foo 重复声明” function foo(){}; console.log(typeof(foo)); } -
以下理解是否正确?(希望各位 dalao 不吝赐教
个人理解的变量提升(只考虑 var 的情况)步骤为:
- 区分函数声明/变量声明。
- 函数声明的标识符先提升至函数作用域顶部,函数定义提升至块作用域顶部。
- 变量声明的标识符提升至函数作用域的顶部。
- 赋值语句留在原地等待执行阶段。
小白的心路历程
(自学 js 中)最近在看《 you-dont-know-js 》 js 的变量提升部分(一版,中文)
在作用域-函数优先部分有如下代码:
foo(); // "b" var a = true; if (a) { function foo() { console.log( "a" ); } } else { function foo() { console.log( "b" ); } } 实际运行时发现 foo(); 一行报 TypeError: foo is not a function 错误。
思考之后觉得应该是 es6 块作用域的问题,导致 foo 的变量提升不如预期。遂更换 node 版本至 4.9 果然成功输出了 "b"
我的理解如下:
var foo; var a; foo(); // 此次相当于 foo 已声明,但未定义,暂为 undefined 。故报错 a = true; if(a){ foo = function(){console.log("a")}; }else{ foo = function(){console.log("b")} } 在理解上面这个出错问题的时候发现在块作用域下 var foo 变量声明和 foo 函数声明放在一起会报 重复声明 错。如下:
{ var foo = 1; // 该句报错,“foo 重复声明” function foo(){}; console.log(typeof(foo)); } 已知 var 可重复声明,该情况(指同标识符的变量声明与函数声明)在全局、函数作用域下无 重复声明 问题。
(后测试同样的代码 node4.9 版本无此问题,个人考虑定位至块作用域特性相关问题,调试发现在还没执行下去的时候就已报错了,应该是 编译阶段 就抛出的问题。
个人基础较差,再往下就没啥头绪了,搜索"块作用域 var 函数声明 重复声明"相关字符也没找到结果。
希望各位 dalao 不吝赐教,指点以下该怎么分析这个问题(特性? 实际代码运行的时候是怎么样的情况?
