每天一个知识点,每天进步1%!
var
- var函数作用域
function test(){
var a = 5
}
test()
console.log(a) //报错
变量a 是存在于 test函数内部的,或者说a是函数的局部变量,这就意味着函数退出后变量会被销毁,因此外界访问不到。
2.var 声明提升
console.log(a) //undefined
var a= 5;
之所以不会报错其实是因为JS运行机制它会把上边的代码看成以下代码执行
var a;
console.log(a)
a =5
3.var 声明的全局变量可以通过window. 访问
var a = 5
console.log(window.a) //5
4.var可以重复声明变量
var a ={name:"haha"};
var a = 5;
console.log(a) //5
let
- let块级作用域
{
let a=5;
console.log(a) //5
}
console.log(a) //报错
变量 a 只能在{} 代码块内被访问,外部是访问不到的
- 暂时性死区
{
console.log(5) // Cannot access 'a' before initialization
let a =5;
}
这种情况被称之为暂时性死区
3.let 不能重复声明变量
let a = 5;
let a = "xixi";
console.log(a) // Identifier 'a' has already been declared
const
const 与let 基本相同,唯一不同是const声明必须赋值,且一般不能修改;
const obj={
name:'haha',
age:18
}
obj.name='xixi';
obj.age=20;
console.log(obj) //{age: 20,name: "xixi"}
如上述代码用const 定义一个对象,并且修改里边的属性,并没有报错,
这是因为 const声明的限制只适用于它指向的变量的引用。
虽然可以这样做,但是不建议这么做,一般用const 声明变量 寓意别人不要去改变所声明的变量
声明风格及最佳实践
1.不使用var
2.const优先,let 次之
总结
1.var有变量提升,let有暂时性死区
2.var有函数作用域,let有块级作用域
3.var 可以重复声明变量,let不可以
4.var声明全局变量可以通过window.访问
5.const声明变量必须要赋值
6.const声明的限制只适用于它指向的变量的引用
例子
// 用var
for(var i=0;i<5;i++){
setTimeout(()=>{
console.log(i) // 过1秒输出5个5
},1000)
}
// 用let
for(let i=0;i<5;i++){
setTimeout(()=>{
console.log(i) // 过1秒输出 0 1 2 3 4
},1000)
}
上述例子考察了let 与var 的区别以及同步异步(宏任务微任务,有兴趣的可以查一下,了解了解)的执行顺序
- 用var时 因为定时任务是异步的,会最后执行,for 循环结束后 i 为5;
- 然后再执行定时任务 1 秒后输出 i 为5,因为是5次所以打印了 5个5
- 用 let 因为let 有块级作用域,每执行一次都会把值存起来,而不是被重新赋值,所以1秒后输出 0 1 2 3 4