let命令
let作用是声明变量,经常使用在for循环里,声明i
//let声明的变量,只在代码块里有效
{
let a=20;
var b=99;
console.log(a)
}
console.log(b)
console.log(a) //a is not defined
let的特点
1.不存在变量提升
var 在声明变量 c 之前,c 已经存在了只是值为undefined;而 let 没有变量提升这种现象。
2.“暂时性死区”(TDZ):代码块内,使用 let 命令声明变量前,该变量都是不可用的。
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
ES6 规定暂时性死区和let、const语句不出现变量提升
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
3.不允许重复声明变量
function a(x){
let x //Uncaught SyntaxError: Identifier 'x' has already been declared
}
function b(x) {
{
let x // 不报错
}
}
4.let 提供了一种块级作用域
ES5 只有全局作用域和函数作用域,ES6新增了块级作用域。
ES6 允许块级作用域的任意嵌套。
内层作用域可以定义外层作用域的同名变量。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
{{{{{{{{let age=90;console.log(age)}}}}}}}} //90
{{{{{{{{{let age=90}console.log(age)}}}}}}}}
//Uncaught ReferenceError: age is not defined 块级作用域
// 以前的IIFE
(function(){
temp=333;
})()
console.log(temp) //333
//现在使用let可以这样写
{
let temp=333
}
const
const声明常量,一旦声明,必须立即赋值,并且值不能改变。
const num; //Uncaught SyntaxError: Missing initializer in const declaration
const num=22;
num=334; //Uncaught TypeError: Assignment to constant variable.
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
const声明的常量,也与let一样不可重复声明。
注意:const变量值不能改变的原因:指向的内存地址不能改变。
ES5 声明变量的方法(2种):var命令和function命令。
ES6 声明变量的方法(6种):var命令、function命令、let命令、const命令,import命令和class命令。
顶层对象属性和全局变量
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
var num1=12;
console.log(window.num1) //12
let num2=16;
console.log(window.num2) //undefined