前景提要
先直接抛出问题: 以下代码报错,求解该怎么 具体分析 这个错误发生的原因?
(目测是受 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 不吝赐教,指点以下该怎么分析这个问题(特性? 实际代码运行的时候是怎么样的情况?