我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文的写作要翻两篇很久之前的两篇文章,一个分号引起的nodejs的惊天大bug。现在这个问题在调试react项目的时候,出现的。但是,引起问题的原因可和react没有什么关系。

苏南大叔:webpack抓虫,分号继续引起的 xxx is not a function问题 - xxx-is-not-a-function
webpack抓虫,分号继续引起的 xxx is not a function问题(图3-1)

苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:node@16.14.2webpack@5.0.0

现象描述

错误提示信息:

Uncaught TypeError: console.log(...) is not a function

但是,console.log(...)怎么可能会不是一个function呢?经过多次试验,这个错误提示信息还可能是:

xxx is not a function

xxx可以指代任何代码。

苏南大叔:webpack抓虫,分号继续引起的 xxx is not a function问题 - 错误截图
webpack抓虫,分号继续引起的 xxx is not a function问题(图3-2)

webpackbug

这个问题还需要回顾到下面的文章:

一般来说,js代码中的分号是可有可无的。但是,在()()这种表达前面,如果涉及到代码合并的话,需要在最前面添加一个分号。主要的原因是括号的解释可能具有歧义。在前面加个分号,就能避免这种错误的解释。

这种惊天大bug的引起只能是先合并代码了(或者说删除回车换行了)。所以,最终苏南大叔把锅定在了webpack上。只要在webpack的代码中,写()()的匿名函数类似代码。而前面一行代码的最后没有写分号的话,就会出现xxx is not a function的错误提示信息。

解决方案

解决方案就是在执行匿名函数的时候,在前面都加上一个分号。例如:

;()()

或者在xxx is not a function那一行最后,加个分号。例如:

console.log("加个分号就好了");

苏南大叔:webpack抓虫,分号继续引起的 xxx is not a function问题 - 增加分号解决问题
webpack抓虫,分号继续引起的 xxx is not a function问题(图3-3)

结束语

这个锅也只能算在webpack上,webpack也算个大冤种了。就是执行了一个删除回车换行的操作,就把本来正常的代码给合并出毛病来了。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   webpack