为什么var x = x 不报错,let x = x 报错?

新手上路,请多包涵
// 不报错
var x = x;

// 报错
let x = x;
// ReferenceError: x is not defined
阅读 2.5k
2 个回答

问题的本质就是JS 变量的「创建create初始化initialize赋值assign」.

var声明

1.找到所有用 var 声明的变量x,在这个环境中「创建」这些变量
2.将变量「初始化」为 undefined
3.开始执行代码 x = xx 变量「赋值」x
总结:
也就是说 var 声明会在代码执行之前就将「「创建」变量,并将其初始化为 undefined」。
这就解释了为什么在 var x = x 之前 console.log(x) 会得到 undefined

let声明

1.找到所有用let 声明的变量,在这个环境中「创建」变量
2.开始执行代码(还未初始化)
3.将x进行初始化为undefined.(这个操作并不是赋值,仅仅是「初始化」)
4.执行RHS操作将x赋值给x.(这才是「赋值」操作)
总结:
因为我们的初始化语句与赋值语句是同一句,所以我们的let x=x同时执行了3,4步的操作.但是这里就出现了一个问题,这一句话是错的.在报错的同时,第三步已经执行完成了,而第四步就没有办法进行,在报错的同时也取消掉了第三步进行的对x的初始化.也就是说这个值已经进行了变量创建,但是并未初始化

参考:
https://www.jianshu.com/p/b87...
http://note.codermagefox.com/...

var x=x等价于
var x=undefined;
x=x;

var具有变量提升的特点而let没有
let x=x的时候 复制的x还没有定义

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