JS不想写分号?那你得注意下这个

问题

今天在测试代码的时候出现了一个让我有点摸不着头脑的事儿

function fn1 () {
    console.log('fn1')
}

fn1()

(function(){
    console.log('fn2')
})()

按理说应该是理所当然的输出 fn1 和 fn2,但其实是在控制台报了错:Uncaught TypeError: fn1(...) is not a function,瞎说什么?fn1怎么会不是一个function?但仔细一看人家说的是fn1(...) is not a function

分析

首先代码应该没有问题,以前应该也写过类似的东西,唯一不同的就是跟以前相比,现在不是很喜欢写分号了,问题可能就出在这,给fn1()后面加上分号果然就没报错了。这样一来,也就能说得通了,fn1()后面没有分号,而紧接其后的又是一个括号(),不管里面内容是什么,他都被解析成了对fn1()函数的调用,也就是fn1()(),所以才会说fn1(...) is not a function

那这样的话,不仅仅是匿名函数自调用,其他任何直接用到()的地方应该都会出现这种问题

// 这里会报错:2 is not a function
var a = 2
(function(){
    console.log('fn')
})

总结

直接使用()切前面没有分号时,代码都会被解析为一次函数的调用。
虽然不用每次都写分号,但还是要注意场合,也去网上查了一下这个问题,解决的办法是在需要用到匿名函数自调用的地方提前加一个分号

var a = 2

;(function(){
    console.log('fn')
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,835评论 0 7
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,943评论 2 17
  • 语句 JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。 ...
    米塔塔阅读 470评论 1 10
  • 就在昨天,老妈和我微信视频,说:听说你买了一辆车。可不是吗?我终于买了一辆自行车。哈哈哈哈,两人不约大笑。 我买了...
    木木木侠阅读 992评论 0 4
  • 金灿灿的玉米囤满农家的庭院 红通通的小枣晾晒在屋前院后 黑黝黝的豆儿装好袋子聚在屋檐下 丰收!今年的秋,农家院落显...
    丰盈仓廪阅读 872评论 0 0