// 全局变量,在浏览器中自动挂载到window对象上 var a = 10; console.log(window.a); // 10
var变量声明,会造成变量提升
1 2 3 4
// var变量声明,会造成变量提升 console.log(b); // undefined var b;
多次使用var声明,后面声明的变量会覆盖前面的声明
1 2 3 4 5
// 多次使用var声明,后面声明的变量会覆盖前面的声明 var c = 20; var c = 30; console.log(c); // 30
在函数中使用var声明变量,该变量是局部的
1 2 3 4 5 6 7
// 在函数中使用var声明变量,该变量是局部的 var d = 40; functionfn() { var d = 50; } console.log(d); //40
函数内变量不使用var声明,会提升为全局变量
1 2 3 4 5 6
// 函数内变量不使用var声明,会提升为全局变量 var e = 60; functionfn(){ e = 70; } console.log(e); // 60
let
let作用于块级作用域
1 2 3 4
{ let a = 10; } console.log(a); // Uncaught ReferenceError: a is not defined
let不存在变量提升
1 2
console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization let b;
let在块级作用域存在“暂时性死区”
1 2 3 4 5
var a = 30; if(true) { // 这形成了块级作用域,后面的let变量声明有“暂时性死区”,在let声明之前访问变量a会报错 a = 40; // Uncaught ReferenceError: Cannot access 'a' before initialization let a; }
let在同一作用域不允许重复声明
1 2 3
let a = 10; let a = 20; // Uncaught SyntaxError: Identifier 'a' has already been declared s
1 2 3 4
functionfn(args) { let args = 10; // Uncaught SyntaxError: Identifier 'args' has already been declared } fn();
不同作用域是可以重复声明的,比如两个块级作用域
1 2 3 4 5
let b = 30; { let b = 40; } console.log(b); // 30
const
const定义的变量是只读的,不能改变
1 2 3
const a = 10; a = 20; console.log(a); // Uncaught TypeError: Assignment to constant variable.
const声明变量必须立刻初始化
1
const b; // Uncaught SyntaxError: Missing initializer in const declaration
使用var,let声明过的变量,不允许再使用const声明
1 2 3 4 5
var c = 30; const c = 40; // Uncaught SyntaxError: Identifier 'c' has already been declared
let d = 50; const d = 60; // Uncaught SyntaxError: Identifier 'd' has already been declared