javascript中的变量声明

ES5 中,使用 var 定义变量(var是 variable 的缩写)。

ES6 中,新增了 let 和 const 来定义变量:

  • • let - 定义变量,代替 var

  • • const - 定义常量

ES5中定义常量

ES5中可以通过 Object.defineProperty 来定义常量。.

// 定义常量 PI
Object.defineProperty(window, 'PI', {
    value: 3.14,
    writable: false,
});

var变量会挂载在 window 对象上

var var1 = 'var1';
console.log(var1);          // var1
console.log(window.var1);   // var1

let let1 = 'let1';
console.log(let1);          // let1
console.log(window.let1);   // undefined

const const1 = 'const1';
console.log(const1);        // const1
console.log(window.const1); // undefined

使用 var 定义变量,容易造成全局污染(污染整个js的作用域)

var变量存在变量提升

console.log(var2);      // undefined
var var2 = 'var2';
console.log(let2);      // 报错:Uncaught ReferenceError: Cannot access 'let2' before initialization
let let2 = 'let2';
console.log(const2);    // 报错:Uncaught ReferenceError: Cannot access 'const2' before initialization
const const2 = 'const2';

var声明不存在块级作用域

{
    var var3 = 'var3';
    let let3 = 'let3';
    const cosnt3 = 'cosnt3';
}
console.log(var3);          // var3
console.log(let3);          // 报错:Uncaught ReferenceError: let3 is not defined
console.log(const3);        // 报错:Uncaught ReferenceError: const3 is not defined

同一作用域下,var可以重复声明变量

var var4 = 'var4';
var var4 = 'var4';
console.log(var4);          // var4

let let4 = 'let4';
let let4 = 'let4';
console.log(let4);          // 报错:Uncaught SyntaxError: Identifier 'let4' has already been declared

const const4 = 'const4';
const const4 = 'const4';
console.log(const4);        // 报错:Uncaught SyntaxError: Identifier 'const4' has already been declared

let和const的暂时性死区(DTC)

const const5 = 'const5';

function test() {
    console.log(const5);
    const const5 = 'const5';
}
test();          // 报错:Uncaught ReferenceError: Cannot access 'const5' before initialization

如果在当前块级作用域中使用了变量 const5,并且在当前块级作用域通过 let/const 声明了同名的变量,那么声明语句必须放在使用之前,也就是DTC。

const变量声明时必须赋值并且不能再修改

const const6 = 'const6';
const6 = 'const7';          // 报错:Uncaught TypeError: Assignment to constant variable.

如果const声明引用数据类型,不允许修改变量的内存指向,但对象里的属性是可以修改的。