ruanyf / es6tutorial

《ECMAScript 6入门》是一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新增的语法特性。

Home Page:http://es6.ruanyifeng.com/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

let const一章中 块级作用域的第一个例子不正确

turingNotaWoman opened this issue · comments

发现一个书中误区;
原文(第三版,第22页 >> 块级作用域):
第一种场景,内层变量可能会覆盖外层变量。

`var tmp = new Date();

function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined
`
正确理解此例子:
不是覆盖,f函数内部的变量tmp与外部的tmp变量没有关系。非文中所说覆盖关系;没有外部tmp还是输出同样结果;

如果没有内部变量呢

@ruanyf 哈哈 阮老师好,很高兴收到您的回复,
您也知道函数f解析后,内部tmp已经切断了tmp对外部变量tmp的引用。
【但是“覆盖”的意思,人们会把他理解为,外部tmp也变成了 undefined】
按照您的表述,换成以下例子可能更合适:
var tmp = new Date(); if( true ){ var tmp = 'hello world'; } console.log( tmp )

这个“覆盖”指的是“shadowing”,指的是子作用域的同名变量会使用外部变量被屏蔽,在子作用域内默认访问不到外部同名变量的值。或者翻译成“遮蔽”,不容易误会吧。