问题
今天在测试代码的时候出现了一个让我有点摸不着头脑的事儿
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')
})