JS中缺少分号可能引发的问题

以 “(”、“[”、“/”、“+”、或 “-” 开始的语句,那么它极有可能和前一条语句合在一起解释。

立即执行函数表达式

(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中也还是会报错

猜你喜欢

转载自juejin.im/post/5c2c713ef265da615d72c151
今日推荐