解剖前端面试之var

作者: 小遁哥 | 来源:发表于2020-04-12 16:31 被阅读0次

    说起这个var勾起了我太多回忆,尽管拒绝了笔试题还是被面试官要求看一下题目说出答案,现在是2020年4月12日,星期日,还在考察相关知识点,让我有点回到了刚上大学的时候,不禁让人有些怀疑...

    总上所述,文笔会有些放肆,请谨慎观看

    不要拿设计缺陷当学问

    题目如下(我强化了一下):

          console.log(a);
          console.log(b);
          if(false){
    
            var a = 2000;
          }
          var b = 1000;
    

    A undefined undefined
    B undefined null
    C Uncaught ReferenceError: a is not defined
    D Uncaught ReferenceError: a is not defined Uncaught ReferenceError: b is not defined

    这道题考察编程意识还是不错的,但是在JS味道却变了

    答案是A,即便在严格模式下("use strict"),也是A,因为var 存在变量提升,没有块级作用域。

    代码的相对位置不会变动,在编译的时候声明会提前

    我更希望有人说选C,理论上来讲,这才是正确的行为,有这种意识是好的

    以上包裹下面的一些,我都当是设计缺陷,从没这么用过,我甚至希望自己不知道这些黑历史,即便是维护旧代码,掌握也不是难事。

    允许重复声明 ,大多是被动重复声明

          var a = 1;
          var a = 100;
          console.log(a);//100
    

    污染window

          a = 1;
          console.log(window.a);//
    

    开启严格模式会报错

    仍然有一些问题不是不用就能解决的,比如for循环

          for(var i=0;i<10;i++){
    
          }
          console.log(i);//10
    

    循环结束后还是能访问到i,或是下面的代码

          for(var i=0;i<10;i++){
            setTimeout(()=>{
              console.log(i);
            },1000)
          }
    

    全部输出10

    17年接触let后就再也不用var了,上面的代码换成let声明,有些会报错,有些会直接解决问题

    那时候,想到了杜甫的一首诗

    闻官军收河南河北

    剑外忽传收蓟北,初闻涕泪满衣裳。

    却看妻子愁何在,漫卷诗书喜欲狂。

    白日放歌须纵酒,青春作伴好还乡。

    即从巴峡穿巫峡,便下襄阳向洛阳。

    块级作用域

          if(true){
            let i = 100;
          }
          console.log(i);
    

    会报错 Uncaught ReferenceError: i is not defined

    暂存死区

          console.log(i);
          let i= 0;
    

    会报错:Cannot access 'i' before initialization

    i 声明之前的区域都叫暂存死区

    这并不意味着问这两个就有多好,这种定义类型的还是少问,代码本就能直观的体现出来,建议用具体的使用方式来反衬理解,定义背的好可不代表会用。

    一句话,用let就完了。

    在和大家说一个知道不如不知道的东东,我要当恶人了,嘿嘿

          for(let i=0;i<10;i++){
            let i = "abc";
            console.log(i);
          }
    

    演化成下面的就会出问题

          for(let i=0;i<10;){
           let i ="abc"
            console.log(i);
            i++;
          }
    

    这个还好,我倒是还没被恶心过,毕竟业务代码要语义化的,用于for循环的简单点无所谓。

    相关文章

      网友评论

        本文标题:解剖前端面试之var

        本文链接:https://www.haomeiwen.com/subject/kmqvmhtx.html