下面代码的输出是什么?
function sayHi(){
console. log(name);
console. log(age);
var name ="Lydia";
let age=21;
}
sayHi0;
1、A:Lydia 和 undefined
2、B:Lydia 和 ReferenceError
3✔C:ReferenceError 和 21
4、D:undefined 和 ReferenceError
答案
答案:D
在函数中,我们首先使用 var 关键字声明了 name 变量。这意味着变量在创建阶段会被提升(JavaScript
会在创建变量创建阶段为其分配内存空间),默认值为 undefined,直到我们实际执行到使用该变量
的行。我们还没有为 name 变量赋值,所以它仍然保持 undefined 的值。
使用 let 关键字(和 const)声明的变量也会存在变量提升,但与 var 不同,初始化没有被提升。在我
们声明(初始化)它们之前,它们是不可访问的。这被称为“暂时死区”。当我们在声明变量之前尝试
访问变量时,JavaScript 会抛出一个 ReferenceError。
译者注:
关于 let 的是否存在变量提升,我们何以用下面的例子来验证:
let name='ConardLi'
{
console. log(name)//Uncaught ReferenceError:name is not defined let name='code 秘密花园'
}
let 变量如果不存在变量提升,console. log(name)就会输出 ConardLi,结果却抛出了 ReferenceError,那
么这很好的说明了,let 也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前
不允许访问。