let
1、let 声明的变量只在 let 命令所在的代码块内有效(块级作用域、局部作用)
2、基本用法:是一个代码块,用{}括起来的
例如 var fn=function(){}函数 {} if(){} for(){} 代码块
//{}括起来的代码块
{
let a = 0;
console.log(a); // 0
}
console.log(a); // 报错 ReferenceError: a is not defined
3、特点:代码块内有效 、不能重复声明 、不存在变量提升
for(var i=0;i<10;i++){
// console.log(i)
function fn(){console.log(i)}
arr.push(fn)
}
arr[0]() //若用var申明,调用数组的每一个函数都将打印10
{
let a = 0;
var b = 1;
}
console.log(b); // 1
console.log(a); // ReferenceError: a is not defined
var a = 1;
var a = 2;
console.log(a); // 2
let b = 3;
let b = 4;
console.log(b); // Identifier 'a' has already been declared
不同于var,var会变量提升
console.log(a); //undefined
var a = "banana";
console.log(b); //ReferenceError: b is not defined
let b = "apple";
不会成为window的属性,即在全局作用域中用let声明的变量,使用window.变量名不会生效
let a=10
consle.log(window.a) //undefined
const
1、const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化(let不用),否则会报错。
注意:但是如果声明引用数据类型,则可以修改其属性的值
const a=100;
var a=200 //const a=200
console.log(a) //报错
const a;
a=100;
console.log(a) //报错
const lion={name:"小羊",age:21};
lion.name="小狮子";
console.log(lion);//小狮子
2、暂时性死区: ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。
var PI = "a";
if(true){
console.log(PI); // ReferenceError: PI is not defined
const PI = "3.1415926";
}
注意点
-
let 和const 关键词声明的变量不具备变量提升(hoisting)特性
-
let 和 const 声明只在最靠近的一个块中(花括号内)有效
-
当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
-
const 在声明时必须被赋值(初始化)