1:Let命令
(1)Let定义块级作用域的变量,var定义的变量会提升。Let不会提升。如下。可以先用是undefined但是let在定义之前是不能用的。会报错Uncaught ReferenceError: letter is not defined(…)
console.log(color)
console.log(letter)
var color = ‘red‘;
let letter = ‘a‘
只要块级作用域内存在let命令,声明的变量不受外部影响。
var tmp = 123;
if (true) {
tmp = ‘abc‘; //tmp is not defined(…)
let tmp;
}
在代码块内,使用let命令声明变量之前,该变量都是不可用,称“暂时性死区”;
typeof x; //使用是在let声明之前x is not defined(…)
let x;
再如function bar(x = y, y = 1) {
return [x, y];
}
bar();// y is not defined(…)x的默认值等于y,此时y还没声明。
(2)通过var在块作用域中定义变量在外面可以访问,{}
通过let在块作用域中定义的变量,在外面不可以访问{}
if (true) {
// 块作用域里面都可以访问
var color = ‘red‘;
let letter = ‘a‘
console.log(color)
console.log(letter)
}
console.log(color) //可以访问
console.log(letter) //不能访问letter is not defined(…)
(3)let保存变量
var arr = []
for (var i = 0; i < 5; i++) {
arr[i] = function () {
console.log(i, ‘iii‘)
}
}
arr[1]() //5,‘iii’
i是全局for循环外面也可以访问。For循环完之后i是5
var arr = [];
for (let j = 0; j < 5; j++) {
arr[j] = function () {
console.log(j, ‘jjjj‘)
}
}
arr[1](); // 1,’iii’
这个函数的时候,会找到这个块作用域,这个作用域中定义了块作用域变量j
console.log(i, j) j是外面无法访问的。
(4):不允许重复声明
function () {
let a = 10;
var a = 1;
}
//Uncaught SyntaxError: Unexpected token (
function () {
let a = 10;
let a = 1;
}
//Uncaught SyntaxError: Unexpected token (
2:const命令
(1)定义之后再也无法修改 (大写,下划线)
var PI = Math.PI;
PI = 3;
console.log(PI) //3
const PI = Math.PI
PI = 3;
console.log(PI) // 报错Assignment to constant variable.(…)
(2)在块作用域中定义一个常量 块作用域内访问有效。外面是访问不到的
if (true) {
const PIa = Math.PI
Let PIa = Math.PI
}
console.log(PIa) //PIa is not defined(…)
(3)必须先定义再使用
console.log(PIa) //Identifier ‘PI‘ has already been declared(…)
const PI = Math.PI;