let、var、const

let、var、const

var

  • var 作用域:在整个 function 内有效
  • 在声明之前就可以引用
function run() {
	console.log(foo) // 声明之前就可以引用,值:undefined
	var foo = "Foo";
}
  • function 外定义会创建全局对象
var foo = "Foo";
console.log(window.foo) // Foo,附着在 window 对象
  • 可以再次定义相同变量
'use strict'

var foo = "foo1"
var foo = "foo2" // foo 值替换为 foo2
  • 闭包引用问题
// 打印 3 次 3
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0);
}

let (ES6)

  • let 作用域;在整个 block 内有效
{
	let a = 123
}

console.log(a) // ReferenceError
  • 声明之后才能引用
function run() {
	console.log(foo) // ReferenceError
	let foo = "Foo";
}
  • function 外定义不会创建全局对象
let foo = "Foo"
console.log(window.foo) // undefined
  • 不可再次定义重复变量
'use strict'

let bar = "bar1"
let bar = "bar2" // SyntaxError
  • 闭包引用问题
// 打印 1 2 3
for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 0);
}

const (ES6)

constlet 很像

  • 无法再次赋值
const a = 42
a = 43 // TypeError
  • 声明的时候就得初始化
const a; // SyntaxError

参考