Luke's home Luke's home
首页
  • 前端文章

    • JavaScript
页面
技术
更多
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Luke xiao

K
首页
  • 前端文章

    • JavaScript
页面
技术
更多
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • javascript

    • 基础知识
    • 进阶知识

      • 类型转换
      • 正则表达式
      • 错误
      • 调试
      • 严格模式(use strict)
      • this关键字
      • JavaScript let 和 const
        • JavaScript 块级作用域(Block Scope)
        • 重新定义变量
        • 循环作用域
        • const 关键字
        • 并非真正的常量
        • 小计
      • json
      • javascriptvoid(0)
      • 异步编程
      • promise
    • 函数

    • JS HTML DOM

    • JS 高级教程

    • 浏览器BOM

    • HTML5新特性

    • CSS3新特性

  • 布局

  • less

  • js库

  • 前端
  • javascript
  • 进阶知识
lukexiao
2021-04-30

JavaScript let 和 const

# JavaScript 块级作用域(Block Scope)

使用 var 关键字声明的变量不具备块级作用域的特性,它在 {} 外依然能被访问到。

{ 
    var x = 2; 
}
// 这里可以使用 x 变量
1
2
3
4

在 ES6 之前,是没有块级作用域的概念的。

ES6 可以使用 let 关键字来实现块级作用域。

let 声明的变量只在 let 命令所在的代码块 {} 内有效,在 {} 之外不能访问。

{ 
    let x = 2;
}
// 这里不能使用 x 变量
1
2
3
4

# 重新定义变量

使用 var 关键字重新声明变量可能会带来问题。

在块中重新声明变量也会重新声明块外的变量:

var x = 10;
// 这里输出 x 为 10
{ 
    var x = 2;
    // 这里输出 x 为 2
}
// 这里输出 x 为 2
1
2
3
4
5
6
7

let 关键字就可以解决这个问题,因为它只在 let 命令所在的代码块 {} 内有效。

var x = 10;
// 这里输出 x 为 10
{ 
    let x = 2;
    // 这里输出 x 为 2
}
// 这里输出 x 为 10
1
2
3
4
5
6
7

# 循环作用域

使用 var 关键字:

var i = 5;
for (var i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i 为 10
1
2
3
4
5

使用 let 关键字:

let i = 5;
for (let i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i 为 5
1
2
3
4
5

在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。

在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响。

# const 关键字

const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:

const PI = 3.141592653589793;
PI = 3.14;      // 报错
PI = PI + 10;   // 报错
1
2
3

const定义常量与使用let 定义的变量相似:

  • 二者都是块级作用域
  • 都不能和它所在作用域内的其他变量或函数拥有相同的名称

两者还有以下两点区别:

  • const声明的常量必须初始化,而let声明的变量不用
  • const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。

# 并非真正的常量

const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:

// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};
 
// 修改属性:
car.color = "red";
 
// 添加属性
car.owner = "Johnson";

1
2
3
4
5
6
7
8
9

但是我们不能对常量对象重新赋值:

const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"};    // 错误
1
2

# 小计

使用var关键字声明的全局作用域变量属于window对象。

使用let关键字声明的全局作用域变量不属于window对象。

使用var关键字声明的变量在任何地方都可以修改。

在相同的作用域或块级作用域中,不能使用let关键字来重置var关键字声明的变量。

在相同的作用域或块级作用域中,不能使用let关键字来重置let关键字声明的变量。

let关键字在不同作用域,或不用块级作用域中是可以重新声明赋值的。

在相同的作用域或块级作用域中,不能使用const关键字来重置var和let关键字声明的变量。

在相同的作用域或块级作用域中,不能使用const关键字来重置const关键字声明的变量

const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:

var关键字定义的变量可以先使用后声明。

let关键字定义的变量需要先声明再使用。

const关键字定义的常量,声明时必须进行初始化,且初始化后不可再修改。

编辑 (opens new window)
上次更新: 2021/08/13, 23:21:49
this关键字
json

← this关键字 json→

最近更新
01
流式布局
08-13
02
flex布局
08-13
03
rem布局
08-13
更多文章>
Theme by Vdoing | Copyright © 2021-2021 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式