var, let, const 的区别

var, let, const 的区别

Created
Apr 24, 2022 12:03 PM
Tags
JavaScript
Property

var

通过 var 声明的变量的作用域取决于该变量的声明位置,当在最外层函数的外部声明 var 变量时,作用域是全局的,在函数中声明 var 时,作用域是局部的。
var 声明的变量可以重新声明和修改,即可以进行以下操作:
var myName = "Alex"; var myName = "Billie"; myName = "Cindy";
var 变量可以重新声明,这导致如果需要声明一个新变量时若有不慎可能会和之前已声明的变量重复,而代码检查时却不会报错。
通过 var 声明的变量在解析时声明操作会被提前至其作用域顶部,变量会先被赋值为 undefined

let

let 声明的变量拥有块级作用域,即其作用域就是其声明位置所处的块一个块是由一对大括号 {} 确定的。
let 声明的变量在同一作用域层次内不可以被重新声明,但可以被修改,由于 let 的这一特性,使用 let 声明变量就不会出现上述 var 的问题。
let myName = "Alex"; myName = "Billie"; let myName = "Cindy"; // error: Identifier 'greeting' has already been declared.
下面这种情况,第一个 let 声明的 x 的作用域是其所在的整个块,包含第二个 let 所处作用域。由于两个 let 不在同一作用域层次内,第二次 let 声明会覆盖第一次的 let,在第二次 let 所处作用域内生效,而并不会报错 error: Identifier 'greeting' has already been declared.
let x = 1; if (x === 1) { let x = 2; console.log(x); // expected output: 2 } console.log(x); // expected output: 1
不过理论上是不建议在不同层次的作用域内重复命名的,因为这样容易引起 bug,比如内层作用域的变量声明被删掉,会导致误用外层作用域的同名变量。
通过 let 声明的变量在解析时声明操作会被提前至其作用域顶部,但变量不会被赋值,因此,如果尝试在声明前使用 let 变量,则会收到 Reference Error

const

const 声明的变量作用域与 let 相同,即变量被声明位置所处的块。
const 声明的变量不能被更新并且不能被重新声明
const myName = "Alex"; const myName = "Billie"; // error: Identifier 'greeting' has already been declared. myName = "Cindy"; // error: Assignment to constant variable.
但是,虽然不能更新 const 声明的变量,却可以使用如下方法修改其属性
const greeting = { message: 'say Hi', times: 4, }; const greeting = { words: 'Hello', number: 'five', }; // error: Assignment to constant variable. greeting.message = 'say Hello instead'; // This is OK.
就像 let 一样,const 声明也被提升到顶部,但是不会初始化。