面试-关于var、let、const的自我反省

755 阅读2分钟

关于var、let、const的自我反省

   我其实在之前一直都对var、let、const有一个简单的了解,当面试官问我varlet的区别时我就回答了 其区别是let不能变量提升,我甚至连他们不可以重复声明都没有回答起来,他是我在学习中没有太重视的一小点,这也让我在面试中吃了不少亏。于是我打算彻底将他搞懂。。。。来看我表演吧

var

还是先说一下相同点把,使用var、let、const的变量是不可被delete的,不使用它们声明可以delete掉并且释放空间。

  d = 1;var a =1;let b =2;const c =3;
  delete a; // 打印出false
  delete b; // 打印出false
  delete c; // 打印出false
  delete d; // 打印出ture
  console.log(d) //Uncaught ReferenceError: d is not defined 说明d的空间被释放调

    声明的变量实际上是window对象的属性,而在全局var声明的变量也相当于是一个window对象的属性,例:

   a = 1;
   var b = 2;
   console.log(window.a) // 1
   console.log(window.b) //2

在严格模式下使用

  'use strict'
  a = 1; // Uncaught ReferenceError: a is not defined

let

  • 允许块级作用域任意嵌套
  • 外层作用域无法读取到内层作用域的变量
  • 内层作用域可以定义外层作用域的同名变量
  • 函数本身的作用域在其所在块级作用域之内
'use strict'
function fn(){console.log('123')}
(function(){
  if(true){
    function fn(){
        console.log('456')
          }        
     })()
  fn(); // 这里我加了严格模式 123 不会受到{}中fn影响;

注:let声明了一个块级作用域的变量在一个‘}’结果之后,该变量会消失

const

   它是定义一个常量与let区别就是 不能重新赋值,会报错

var&let&const区别总结

  • var定义的变量没有块的概念,可以跨快访问,不能跨函数访问,有变量提升,可重复声明
  • let 定义的变量,只能在块作用域访问,不能跨快访问,也不能跨函数访问,无变量提升,不可重复声明。
  • let 声明的变量只在块级作用域有效,不存在变量提升,而是绑定在暂时性死区或者说let变量提升了,但是在let声明变量前不能使用该变量,这种叫暂时性死区,如果有重复变量let会在编译阶段报错。