6.3 let
【1】var的两个问题
i:会被声明提前——打乱程序的正常执行顺序
ii:没有块级作用域——代码块内的变量会超出其范围,影响到外部变量
【2】块级作用域:指的是对象{}和function的{}之外,其余if else、for、等程序结构的{}范围,在其他语言中称为块级作用域。但是,在js中这些{},都不是作用域。拦不住内部的局部变量声明被提前。
【3】使用let的优点
i:不会被声明提前——保证程序顺序执行
ii:拥有块级作用域——作用域内的变量不再影响作用域外的变量
【4】let的本质:底层会被翻译成匿名函数自调用
【5】let的注意事项
i:在使用let声明变量之前,不能使用该变量
ii:在同一作用域内,禁止声明两个同名的变量,(一个var声明,一个let声明也不行;更不用说两个都是let声明了)
iii:因为let底层相当于匿名函数自调用,所以即使在全局创建的let变量,在window中也找不到
【6】示例
//全局变量t,来记录程序的执行时间
var t=0;
//第一个函数,执行,耗时0.8s
function fun1(){
//var t;//undefined
//fun1中有了局部变量t
//今后再操作t时,就不会去全局找了!而是所有操作都作用在局部变量t上了。
console.log(`执行任务1,耗时0.8s`);
//将fun1的执行时间累加到全局变量t上
t+=0.8;//因为fun1中有局部变量t,所以,0.8被加到了局部变量t上,而没有加到全局t上。
//后来,在fun1中添加如下代码
//因为if后条件为false,所以if内的代码根本没执行!
if(false){//不是作用域
var t=new Date();
//var t;//被提前到当前函数的顶部
//t=new Date();
console.log(`上线时间:${t.toLocaleString()}`)
}
}
//第二个函数,执行,耗时0.3s
function fun2(){
console.log(`执行任务2,耗时0.3s`)
//将fun2的执行时间累加到全局变量t上
t+=0.3;
}
fun1();
fun2();
console.log(`共耗时:${t}s`);//1.1