以 “(”、“[”、“/”、“+”、或 “-” 开始的语句,那么它极有可能和前一条语句合在一起解释。
立即执行函数表达式
(function(){alert("1")})()// 可以正常执行
(function(){alert("2")})()// TypeError
复制代码
// 均可正常执行
(function(){alert("1")})();
(function(){alert("2")})()
复制代码
还是立即执行函数表达式
// 希望声明obj后,能够输出到控制台,但是会TypeError
var obj = {
a:1
}(function(){
console.log(obj)
})()
复制代码
var obj = {
a:1
};(function(){
console.log(obj)
})()//{a: 1}
复制代码
原因
- 因为JS的自动分号插入机制而隐藏的问题。
(
开头的立即执行函数表达式,它的(funtion()
与上一句进行了解析。剩下的就只有{console.log(obj)})()
了。()
是执行函数,由于{console.log(obj)})
并不是一个函数,所以会出现TypeError。
如何避免
- 每句代码后面加分号表示已经结束
- 即使日常coding不会有这种写法,但是在压缩JS的时候,还是很大可能被压缩成这样,并且在当前的Chrome中也还是会报错