Web前端之路优美编程

解剖前端面试之var

2020-04-12  本文已影响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循环的简单点无所谓。

上一篇下一篇

猜你喜欢

热点阅读