1.1.0 let命令
1,let只在所在的代码块内有效
例子:
{
let a=10
var b=1
}
console.log(a) ==报错
console.log(b) ==1
-
for 循环循环中就很适合使用let命令
2,let不存在变量提升的问题
var 声明变量,在声明之前使用会输出undefined,但是let变不会出现
例子:
console.log(f1) ==不报错,输出undefined
var f1=2
console.log(f2) ===报错
let f2=2
3,只要在块级作用域内存在了let命令,他就不在受到外部的影响
var temp=123
if(true)
{
temp='abc' ----->此处会报错
let temp
}
也就是说使用了let定义,同一代码块中就一定不能在let之前使用
4,不允许重复声明
例子:
function()
{
let a=1
var a=2 ---->此处会报错
}
function()
{
let a=1
let a=2 ---->此处会报错
}
5,let 为JavaScript新增加了一个块级作用域
ES5 只有全局作用域和函数作用域,没有块级作用域,导致很多场景存在问题
例子:
var temp=new Date()
function f(){
comsole.log(tmp)
if(flase){
var tmp='hello'
}
}
f() ----> undefined
我们的打算是输出一个日期(Date()),但是实际确实一个undefined,原因是内部使用了tmp 变量var,导致变量提升(上面第2点)所以输出了一个undefined
例子:
var s ='hello'
for(var i=0;i<s.length;i++)
{
console.log(s[i])
}
comsole.log(i) //5
按道理 后面一个log应该打不出来i 才对,但是却依旧能够输出,这就是var 存在变量泄露的问题
ES6 的块级别作用域
例子:
function f1()
{
let n=5
if(true)
{
let n=6
}
console.log(n) // 5
}
我们预想,要么报错(上面第4点),要么打印6,但是却打印了5,原因是 这里就是两个块级作用域,f1(){}和 if {},所以他打印出来的是5
6,do 表达式
本质上,块级作用域是一个语句,讲多个代码块封装在一起,没有返回值
例子:
{
let t=fn()
t=t*t+1
}
我们如何取到这个块的返回值呢?
可以用do 表达式
let x=do{
let t=fn()
t=t*t+1
}