xinbaihui / Blog

web front end
1 stars 0 forks source link

【ES6】let定义的变量有提升吗 #9

Open xinbaihui opened 5 years ago

xinbaihui commented 5 years ago

在被问到var和let的区别时,我通常说var有变量提升,let没有。 其实这样并不准确,确切的说let也有变量提升,用一个例子来证明这个观点。

let name = 'Baihui'
{
  console.log(name)
  let name = 'Ella'
}
Answer Uncaught ReferenceError: name is not defined

如果不存在变量提升,应该输出Baihui,但是却抛出ReferenceError。 let也存在变量提升,但是它存在一个“临时死区”,在变量未初始化或赋值前不允许访问。

那么在非“临时死区”访问呢:

// console.log(name)  // 临时死区
let name
console.log(name) 
Answer undefined

在 非“临时死区”,如果let定义的变量未被赋值, 此时变量的值是undefined,相当于let 声明时初始化为undefined了,但是没有被提升。

变量的赋值分为三个阶段:

关于let、var和function:

参考:https://github.com/lydiahallie/javascript-questions