let与var 块级作用域

javaScript中没有块级作用域,执行JavaScript代码可能会获取到意想不到的结果。比如:

1 for (var index = 0; index < 5; index++) {
2   console.log(index)
3 }
4 console.log(index, '在外面访问index')

执行结果:

 

 

 因为JavaScript没有块级作用域,在for循环结束后依旧会存在循环外部的执行环境中因此能够打印出来。

 ECMAScript 6(简称ES6)中新增了块级作用域。同样的for循环

1 for (let index = 0; index < 5; index++) {
2   console.log(index)
3 }
4 console.log(index, '在外面访问index')

此时的执行结果:

 

 对于let来说,for语句初始化变量的表达式所定义的变量,只会存在循环的环境中,在循环外部打印index ,只能报错。

 

扩展知识:

输出是什么?

1 function sayHi() {
2   console.log(name)
3   console.log(age)
4   var name = 'Lydia'
5   let age = 21
6 }
7 
8 sayHi()

答案: undefined 和 ReferenceError

 

在函数内部,我们首先通过 var 关键字声明了 name 变量。这意味着变量被提升了(内存空间在创建阶段就被设置好了),直到程序运行到定义变量位置之前默认值都是 undefined。因为当我们打印 name 变量时还没有执行到定义变量的位置,因此变量的值保持为 undefined

通过 let 和 const 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。

 

 ------------------------------------------------------------2020.10.27 补充 ------------------------------------------------------------

 

delete操作符返回一个布尔值: true指删除成功,否则返回false. 但是通过 var, const 或 let 关键字声明的变量无法用 delete 操作符来删除。举个栗子

 

posted @ 2020-09-02 13:48  进击的木头ya  阅读(258)  评论(0)    收藏  举报