萌新面试:let和var的区别

137 阅读2分钟

@TOC

前言

let和var的区别

  1. let是ES6引入的关键字,var属于ES5规范
  2. let具有块级作用域概念,var属于全局作用域
  3. let变量提升会出现暂时性死区,也相当于在暂时性死区调用变量;var的声明的变量都会被提升到其作用域最顶部
  4. let定义的变量不存储在window对象中;var在非严格模式下,var定义的变量会绑定到window对象上
  5. let不允许重复声明,var可以
  • let定义变量有块级作用域;var定义的变量没有块级作用域的概念
if(true){
    var a = 10;
}
console.log(a); //10

a作为全局变量,可以打印出来

if(true){
    let b = 20;
}
console.log(b);//ReferenceError: b is not defined

b相当于局部变量,不在其作用域内则出错



  • let变量提升会出现暂时性死区,也相当于在暂时性死区调用变量;var的声明的变量都会被提升到其作用域最顶部
console.log(m); //ReferenceError: Cannot access 'm' before initialization
let m = 3;
console.log(m);

ReferenceError: Cannot access 'm' before initialization出现说明实际上let声明之前的变量已被提升到顶端了,但是由于变量是存储在暂时性死区里面,当被访问执行这个变量时是不被允许的

console.log(i); //undefined
var i = 2;
console.log(i); //2

// 相当于
var i = undefined;
console.log(i); //undefined
var i = 2;
console.log(i); //2

var声明的变量在没有被声明之前使用可以提升到全局作用域,就是说没有被声明却访问执行的变量可以编译而不出错



  • let定义的变量不存储在window对象中;var在非严格模式下,var定义的变量会绑定到window对象上
<script>
    let i = 1;
    console.log("i" in window); //false
    console.log(window.i);
</script>

false出现说明let定义的变量并不存储在window对象中

<script>
    var i = 2;
    console.log("i" in window); //true
    console.log(window.i); // 2
</script>

在非严格模式习,通过var定义的变量会绑定到window对象上



引申

问Ⅰ:var好还是let好?
let好,所以放弃使用var。let是ES6为了修复var造成的bug,可以将let看做成var的进化版。

问Ⅱ:var定义的变量和window全局变量的区别?

  1. var定义的变量有变量提升,window没有
  2. var在函数中定义的变量在函数外不能访问,window可以
  3. var定义的变量不能使用关键字delete删除,window可以
  • var定义的变量有变量提升,window没有
<script>
    var i = undefined;
    console.log(i); //undefined
    var i = 2;
    console.log(i); //2
</script>
<script>
    console.log(c)//c is not defined 
    window.c = 2;
    console.log(c);
</script>

  • var在函数中定义的变量在函数外不能访问,window可以
<script>
    function fn(){
        var p = 2;
        window.q = 3;
    }
    fn() // 调用函数

    console.log(p); //p is not defined
    console.log(q); // 3
</script>

  • var定义的变量不能使用关键字delete删除,window可以
<script>
    var a = 2;
    window.b = 3;
    delete a;
    delete c;
    console.log(a); //undefined
    console.log(c); // 2
</script>



总结

每天一个前端基础知识总结和记录,每天都是要学习的一天。