解剖前端面试之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循环的简单点无所谓。