说起这个 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
污染 Windows
- a = 1;
- console.log(Windows.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 循环的简单点无所谓.
来源: http://www.jianshu.com/p/419bec76ae60