在函数中,我们⾸先使⽤ 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 也存在变量提升,但是它存在⼀个“暂时
死区”,在变量未初始化或赋值前不允许访问。
变量的赋值可以分为三个阶段:
创建变量,在内存中开辟空间
初始化变量,将变量初始化为 undefined
真正赋值
关于 let 、 var 和 function :
let 的「创建」过程被提升了,但是初始化没有提升。
var 的「创建」和「初始化」都被提升了。
function 的「创建」「初始化」和「赋值」都被提升了。