关于临时死区与typedof的疑问

深入理解es6里有代码如下

if( condition ){
    console.log(  typeof  value )//引用错误,value is not defined
    let value = "blue"
}

初始化value的语句不会执行,那么为什么我在空白文件中输入
console.log( typeof none )输出的是undefined,我这里没有声明none啊,除非typeof none算是声明none了。然后我输入
console.log( typeof myvalue)//undefined
console.log( myvalue)
发现myvalue is not defined,这说明typeof myvalue并不会声明一个未初始化的全局变量myvalue
typeof 对一个没声明的变量使用输出的为什么是undefined??

下面还有个问题
上面由于let不会发生变量提升,所以myvalue并没有声明,因此输出undefined
那么下面的代码为什么输出的是undefined,是因为let 创建的是块作用域内的value,而typeof value是全局环境下的value,因此输出undefine吗?

console.log( typeof value )//undefined
if( condition ){
    let value = "blue"
}
阅读 2.9k
2 个回答
  1. typeof对于未声明的变量,其返回值是undefinedhttps://developer.mozilla.org...
  2. 当前作用域下一个变量被let之后会有暂时死区,然后再let前使用这个变量就会爆出xxx is not defined的错误。但是lz的代码中let是在if的作用域内的,所以外层的typeof value还是遵循上一条的规则。
新手上路,请多包涵

这两个问题都涉及临时性死区的概念,第一个问题是从if语句到使用let声明并初始化值之前的区域是let声明变量的临时性死区,在这个区域使用typeof一定会报错,第二个问题,是因为if语句开始到let声明和初始化值之前是临时性死区,而console.log(typeof value);不在临时性死区,let和const也存在变量提升,但其变量提升是发生在临时性死区外。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题