1.let声明变量
变量未声明就使用,会报错,is not defined
变量声明后,初始值为undefined。未赋值就使用,此时变量的值为:undefined
2.与var的区别
var 有变量提升 没有块级作用域 可以重复声明 污染全局变量
let没有变量提升 有块级作用域 不能重复声明 不污染全局变量
1.没有变量提升,有块级作用域。
console.log(a); //undefined
console.log(b); //报错 b is not defined
if (1 === 1) {
var a = 1;
let b = 10; //b只在此{}中使用
}
console.log(b);//报错 b is not defined
以上代码一起执行时,a可以打印
2.不能重复声明
var a = 1;
var a = 2;
console.log(a); //2 后面声明的覆盖前面的
let b = 1;
let b = 2;
console.log(b); //报错 Identifier 'b' has already been declared
以上代码一起执行时,程序报错,a不会打印,一般var和let不会混用吧
3.不污染全局变量
// let RegExp = 10;
// console.log(RegExp); //10
// console.log(window.RegExp); //ƒ RegExp() { [native code] }
var RegExp = 10;
console.log(RegExp); //10
console.log(window.RegExp); //10
3.const声明常量
1.声明常量 一旦被声明 无法修改 不能修改字面量 但可以修改对象内部的内容
与let一样没有变量提升 是块级作用域 不能被重复声明 不污染全局变量
const max = 20;
// max = 30; //Assignment to constant variable. 不能修改字面量
const person = {
name: "zhangsan"
}
person.name = "lisi";
console.log(person); //{name: "lisi"} 但可以修改对象内部的内容
4.let的应用 for循环
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function() {
return i; //
}
}
console.log(arr);
console.log(arr[5]()); //10
// 循环结束,arr中存放10个函数,每个函数中有一个Global,Global中的i=10
// 打印函数,看函数内容:
// [[Scopes]]: Scopes[1]
// 0: Global {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
// 全局作用域中的i=10
const arr1 = []; //没有变量提升,每次循环,都会创建一个块级作用域,每个作用域中都有独立的变量i,最终函数执行。
for (let i = 0; i < 10; i++) {
arr1[i] = function() {
return i;
}
}
console.log(arr1);
console.log(arr1[5]()); //5
//循环结束 arr中存放10个函数,每个函数有一个块级作用域和全局作用域,全局作用域中i=10,块级作用域中i随着循环体变化。函数执行时,会先去块级作用域中取值。
// 打印函数,看函数内容:
// [[Scopes]]: Scopes[2]
// 0: Block {i: 0}
// 1: Global {parent: Window, opener: null, top: Window, length: 0, frames: Window, …
5.let和const使用建议
默认情况下使用const,当变量值需要修改时用let。