0%

var、let 和 const

varletconst

letvar 的区别

  1. let 仅作用于 let 命令所在的代码块内( block-scoped );而 var 声明的变量作用于函数块内( function-scoped ),只有函数块内能引入新的作用域。
  2. let 不受变量提升的约束;而 var 声明的变量存在变量提升。
  3. let 声明的全局变量不是全局对象的属性,即不能通过 window 对象来访问;而 var 声明的全局变量是全局对象的属性,即可以通过 window 对象来访问。
  4. let 不允许重复定义同一个变量;而 var 命令可以无限次重复定义一个变量。

Example 1:作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function timecount1() {
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
}

function timecount2() {
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
}

timecount1();
// 3
// 3
// 3
timecount2();
// 0
// 1
// 2

Example 2:变量提升

1
2
3
4
5
6
7
console.log(x); // undefined
var x = 1;
console.log(x); // 1

console.log(y); // ReferenceError
let y = 2;
console.log(y);

Example 3:全局变量

1
2
3
4
5
var x = 1;
console.log(window.x); // 1

let y = 2;
console.log(window.y); // undefined

Example 4:重复定义

1
2
3
4
5
6
var x = 1;
var x = 2;
console.log(x); // 2

let y = 1;
let y = 2; // SyntaxError

立即执行函数(IIFE

let 出现之前,往往使用立即执行函数解决 var 声明的变量的作用域问题。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function timecount3() {
for (var i = 0; i < 3; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000);
}(i));
}
}

timecount3();
// 0
// 1
// 2

严格模式

在严格模式下,不允许使用未定义过的变量(即不会有变量提升的问题出现了)。

const 命令

let 命令用法基本相同,用于声明一个常量,一旦声明,该常量值无法改变。

1
2
3
4
const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3; // TypeError

使用 const 命令声明的对象,对像本身无法改变,但是对象的属性值依旧可以改变。

1
2
3
4
5
const obj = { a: 1 };
// obj = { a: 2 }; // TypeError
obj.a = 2; // This will work

console.log(obj.a); // 2