(目测是受 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 不吝赐教,指点以下该怎么分析这个问题(特性? 实际代码运行的时候是怎么样的情况?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.