1.新的两种变量声明方式
- let 和 const
通过var声明变量有几个小问题: 1.可以重复声明 2.不能定义常量 3.不支持块级作用域 4.变量提升,可以认为没有预编译
let不能重复声明:
let a = 1
let a = 2 //报错
块级作用域:
if(true){
var b = 1
}
console.log(b) //b是1
-----------------------------------
if(true){
let a = 1
}
console.log(a) //报错,a没有定义
--------------------------------------------
//以前的js只有两个作用域:全局作用域和函数级作用域
// let不会变量提升
let a = 2
{
console.log(a) //报错,a没有定义,只有一个语句块的话,不会打印外部的a
let a = 1
console.log(a) //a为1
}
-------------------------------------------------------
//经典应用
for(var i = 0;i< 2;i++){
setTimeout(function(){
console.log(i) //打印 2 2,因为i是全局变量,事件循环后i已经变为2
},1000)
}
-----------------------
for(let i = 0;i< 2;i++){
setTimeout(function(){
console.log(i) //打印 0 1,i是for循环内部的变量
},1000)
}
//对应的es5代码
var loop = functiton(i){
setTimeout(functtion(){
console.log(i)
},1000)
}
for(var i = 0;i< 2;i++){
loop(i)
}
--------------------------------
定义常量:
const PI = 3.14 //不能重新赋值
PI = 5 //报错
-----------------------------------
//注意
const user = {name: '冰冰'}
user.name = 'jack' //不报错,user引用的地址不能修改,
//但是地址引用的堆内存数据可以修改
user = {name: '天天'} //报错,另开一块内存是不行滴
关于循环
for(let i =0; i < 5; i++) {
...
}
这里会形成5个块级作用域