问题的本质就是JS 变量的「创建create、初始化initialize 和赋值assign」. var声明 1.找到所有用 var 声明的变量x,在这个环境中「创建」这些变量2.将变量「初始化」为 undefined3.开始执行代码 x = x 将 x 变量「赋值」为 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/...
问题的本质就是JS 变量的「
创建create
、初始化initialize
和赋值assign
」.var声明
let声明
参考:
https://www.jianshu.com/p/b87...
http://note.codermagefox.com/...