解剖前端面试之var

说起这个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循环的简单点无所谓。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):