var/let/const

每天一个知识点,每天进步1%!

var

  1. 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

  1. let块级作用域
 {
     let a=5;
     console.log(a) //5
 }
console.log(a) //报错

变量 a 只能在{} 代码块内被访问,外部是访问不到的

  1. 暂时性死区
{
    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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。