一、let
let用于声明变量,但是只在最近的代码块之内有效。
for(i=0;i<2;i++){
let a=30;
var b=20;
}
alert(b) //20
alert(a) //a is not defined
- 暂时性死区
在代码块内,在使用let语句声明前,该变量都不可用。
暂时性死区的本质就是,只要一进入当前作用域,要是使用变量就已经存在了,但是不可获取,只有声明了该变量,该变量才可以使用和获取。 - 不允许重复声明:
function test(){
let a = 10;
var a = 1;//报错:不允许重复声明
}
test();
function s(){
let a = 10;
let a = 1;//报错:不允许重复声明
}
s();
function s(){
var a = 10;
var a = 1;//
alert(a);//不报错,输出1
}
s();
function func(arg){
let arg;//报错:arg 已经被声明了
}
func();
function func2(arg){
{
let arg;}//不报错
}
func2();
二、块级作用域
- 目的:防止内层变量覆盖外层变量;用来计数的循环变量泄露成全局变量。
1.外层代码块不收内层代码块的影响
var a = 5;
if(true){
var a = 10;
}
alert(a); //5
2.有三层块级作用域,前面的作用域不可以访问最内层的a
{
{
{
let a=10;
}}}}
{
{
let a=5;
{
let a=10;
}
alert(a); //5
}}}
3.考虑到环境导致的行为差异太大,最好写成函数表达式,而不是函数声明语句。
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
三、const命令
1、const声明一个只读的常量。一旦声明,常量的值就不能改变。
- 只在块级作用域中起作用
if(true){
const a = 5;
}
alert(a); //报错:找不到
- 要先声明在调用
if(true){
a = 6;
const a = 5;
alert(a);
}
- 不能重复声明变量
const a = 5;
const a = 4; //报错:a已经被声明过了
2、本质
并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
对于复合数据类型,我们可以对它使用一些方法,但不可直接赋值。
四、声明变量的六种方法
(1)var和function
声明的全局变量,依旧是顶层对象的属性
(2)let和const属性
声明的全局变量,不属于顶层对象的属性
(3)import命令和class命令