点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

前言

  • 在线音乐[1]戳我呀!

  • 音乐博客源码[2]上线啦!

  • 上篇写的想写好面向对象的代码,这篇一定要看 | 重学JS[3]提到的匿名函数提到的分号引起的报错,有猿友感兴趣私信,接下来看看一个分号引起的一系列思考。


面试官:知道什么叫类吗?
我这个人很实在,工作努力,不知道什么叫累(类)。

贴一张尤大大17年在知乎说的一段话。

74fe6d709d23448795ecc673a328c1db_tplv-k3u1fbpfcp-watermark.jpg

52abedf205f04c778fa909291df41785_tplv-k3u1fbpfcp-watermark.jpg

被网友笑死。

什么情况下不加分号必报错?

其实只要我们避免不加分号,程序能正常跑通,那我们就没必要加上分号啦。

个人认为不加分号代码可读性、可观性有所提升。

那么问题来了,什么情况下不加分号会有问题?

1. 小括号开头的前一条语句

这里我们可以拿一下上一篇写的想写好面向对象的代码,这篇一定要看 | 重学JS[4]里面的一个例子。

var a = 4
console.log(a);(function () {function load () {console.log('添加一个事件处理程序到 load 事件')}window.$ = function () { // 向外暴露一个全局函数return {load: load}}
})()
复制代码

想说的一点是,为什么匿名函数前面要加分号;

假设:如果不加分号,程序最终编译成这样子:

var a = 4
console.log(a)(function () {...}
复制代码

结果就会报错:Uncaught TypeError: console.log(...) is not a function

Why?

那是因为匿名函数是以括号()为开头,对于程序括号()代表函数执行,那前面应该就有函数名,编译后空格去掉就console.log(a)(...),自然报错。

这也是为什么JS语句后要加分号的原因。

那我不想在每条语句(console.log(a))后都加分号怎么办?

就需要在匿名函数前加分号,后面不加就前面加。

再来一条例子看看:

var a = 4
(function (){})()// 程序理解是这样子的:
var a = 4(function (){})()4后面是括号(),那说明4应该是一个函数,只有函数才加括号执行。
执行4函数,发现4并不是函数,所以报错。// 浏览器报错:Uncaught TypeError: 4 is not a function
复制代码

这就是小括号开头的前一条语句要加分号。(匿名函数)

2. 中方括号开头的前一条语句

var b = 4[1, 3].forEach(function () {})// 程序理解是这样子的:var b = 4[1, 3].forEach(function () {})// 4[3] 这是什么语法?// 自然是undefined。// 果不其然,浏览器报错:// Uncaught TypeError: Cannot read properties of undefined (reading 'forEach')复制代码

当然,解决方法就是在行首加分号。

在JQ时代,为什么总有人喜欢在js文件开头加分号?

;var obj = {};
(function() {})()
复制代码

那是因为怕js文件合并压缩的时候,会报错,因为不确保其他同事的js文件有没有加分号。(会因为缺少分号,导致语法报错)

压缩的时候,压缩流程是怎样的?

  • 去除多余字符: 空格,换行及注释

  • 一般来说中文会占用更大的空间。

  • 替换掉多余字符后会有什么问题产生呢?

  • 有,比如多行代码压缩到一行时要注意行尾分号。

  • 这就需要通过以下介绍的 AST 来解决。

    • 为什么要压缩变量名?

    • 比如你定义的函数名叫fun(),可能会变成a()

    • 为什么?

    • 更好的节省空间。

    • 压缩变量名:变量名,函数名及属性名

    • 当完成代码压缩 (compress) 时,代码的混淆 (mangle) 也捎带完成。(缩短变量的命名也需要 AST 支持)

uglify 在代码压缩中使用到的解析器是 UglifyJS。

// 原始代码
const code = `const a = 3;` // 通过 UglifyJS 把代码解析为 AST
const ast = UglifyJS.parse(code);
ast.figure_out_scope(); // 转化为一颗更小的 AST 树
compressor = UglifyJS.Compressor();
ast = ast.transform(compressor); // 再把 AST 转化为代码
code = ast.print_to_string();
复制代码

压缩代码的过程:code -> AST -> (transform)一颗更小的AST -> code

4081634269-5e55ce8f695cc_articlex.jpg

附上webpack删除项目全部输出console.log

config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
复制代码

那现在为什么不用加分号了?

那是因为人家插件(babel)帮我们处理好了,所以我们才高枕无忧开发。

最后

尤大大说:我的Vue代码全部不带分号,其实加不加分号也只是编码风格问题,不必引起一场口水战。

以往推荐

老湿说的万物皆对象,你也信?[5]

Vue-Cli3搭建组件库[6]

Vue实现动态路由(和面试官吹项目亮点)[7]

项目中你不知道的Axios骚操作(手写核心原理、兼容性)[8]

VuePress搭建项目组件文档[9]

koa2+vue+nginx部署[10]

vue-typescript-admin-template后台管理系统[11]

原文链接

juejin.cn/post/700352…[12]

关于本文

作者:git-Dignity

https://juejin.cn/post/7003522601523871775

往期推荐

大厂面试过程复盘(微信/阿里/头条,附答案篇)

面试题:说说事件循环机制(满分答案来了)

专心工作只想搞钱的前端女程序员的2020

最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

点个在看支持我吧

祖师爷尤大说我的代码全部不加分号 | 重学JS相关推荐

  1. 【重学JS系列】slice用法大合集

    让我们回顾下slice的日常用法 slice 工作原理 在深入研究一些更高级的用法之前,让我们看一下slice方法的基础知识.如MDN文档,slice 是数组上的一个方法,它最多有两个参数: arr. ...

  2. 关于JavaScript代码加不加分号的问题

    按自己喜好,可以加可以不加,没什么影响. 但是遇到以 "("."["."/"."+"."-"开始的语 ...

  3. 程序员必知的编程4大祖师爷,C语言之父堪称编程界的牛顿!

    编程语言哪家好,这是网友们一直争议和调侃的话题. 不过,并不是所有的程序员都知道编程语言的开山鼻祖. 不得不说,正是因为拜在祖师爷门下,才混有今天撸代码这口饭吃. 下面我们就来了解一下编程语言的祖师爷 ...

  4. thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...

    非非非标题党,干货预警!!! 介绍 大家好,我是清池交友 app 开发日记,记录清池交友 app 开发中学习过程和踩坑日记,伪全栈[1] 技术栈:前端 js,vue,uniapp,后端 java 尤大 ...

  5. OSChina 周五乱弹 ——晒晒十大祖师爷级计算机写真

    2019独角兽企业重金招聘Python工程师标准>>> @小编辑 : 卢冠廷 -- 一生所爱. 真会玩,还会点歌了. 一生所爱 - 卢冠廷;莫文蔚 手机党少年们想听歌,请使劲儿戳(这 ...

  6. 计算机科学中的犹太人,清明需要纪念的5大计算机界祖师爷,其中一个是犹太人!...

    在清明这个扫墓踏青的节日里,我们一下追忆那些计算机界的祖师爷. 追思他们对于编程界做出的卓越贡献,下面和W3Cschool一起纪念计算机界祖师爷们: 0.人工智能之父约翰·麦卡锡 约翰·麦卡锡开创了人 ...

  7. 有人问我:程序员要供祖师爷的话该供谁?

    有人问我:程序员是不是都抽烟? 我想了半天我抽烟完全是因为医生,在我刚上大学的时候还不会吸烟,有一天嗓子特别疼,我就去医院检查,大夫检查之后对我说,没什么太大毛病,你少抽点烟就行了,于是乎我走出了医院 ...

  8. vue created 调用方法_深入解析 Vue 的热更新原理,偷学尤大的秘籍?

    大家都用过 Vue-CLI 创建 vue 应用,在开发的时候我们修改了 vue 文件,保存了文件,浏览器上就自动更新出我们写的组件内容,非常的顺滑流畅,大大提高了开发效率.想知道这背后是怎么实现的吗, ...

  9. 尤大直播分享:vue3生态进展和展望

    大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 前言 10月23日,参加了前端早早聊组织的[vue生态专场],准备写一波分享方便大家学习.早上有4个话题:vola ...

最新文章

  1. 每个程序员都应该了解的内存知识(3)-虚拟内存
  2. Golang gRPC实践 连载六 内置Trace
  3. php 判断字符串是不存在json中
  4. mysql数据库优化大全_MySQL数据库优化技巧大全
  5. Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
  6. 如何在C语言中使用正则表达式
  7. SAP CRM product hierarchy和category的三个问题问答
  8. 趣图:你能Get到笑点么?
  9. mysql batch 失败_mysql突然挂掉,重启失败,求助
  10. 人工智能AI实战100讲(五)-基于强化学习的自动化剪枝模型
  11. Linux(Ubuntu 16) 下Java开发环境的配置(二)------Tomcat的配置及常见问题
  12. element label动态赋值_基于Element封装可拖动放大缩小的弹窗
  13. java中四类八中_JAVA中的八中基本数据类型
  14. sd-card on android 5.0,Android5.0以上SDCard文件删除问题
  15. C语言中更改用户名,如何更改C:User/Administrator这个文件夹的名字
  16. apms阅卷系统服务器,apms全通纸笔王网上阅卷系统操作流程
  17. 抖音短视频 产品需求文档
  18. PowerDesigner的使用
  19. AI数学基础(1)--- 马尔可夫不等式
  20. 打印机无法访问计算机,打印机拒绝访问,详细教您打印机拒绝访问无法连接怎么解决...

热门文章

  1. Lambda表达式(三更草堂)
  2. NetSuite应付暂估报表
  3. Mac Sublime Text编辑器 过滤所有符合条件的查找行
  4. 根据名字画图做背景头像
  5. 【Python学习教程】Python异常处理机制
  6. 西瓜书学习笔记——第十一章:特征选择与稀疏学习
  7. 《帝国网站管理系统》目录结构介绍
  8. css 布局之 display:grid
  9. 前端学习--【基础01】使用VMware虚拟机模拟软件配置一台CentOS 7操作系统的电脑
  10. ET框架-17 ET框架登录账号请求逻辑编写(2)