您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

分号导致的问题

JavaScript 中分号是可选的,解释器会对分号进行补全。

如果选择不写分号,需要注意一些使用上的问题。

不写分号,相当于将插入分号的权利递交给解释器,对于某些情况,可能会出现非预期的:

var fn = function() {
  return
    '我怎么没被返回呢??'
}

console.log(fn()) // :undefined

由于 return 已经是可以被作为完整的语句,所以解释器会在 return 后插入分号,上面这段在被处理后可能是这样的:

var fn = function() {
  return;
    '我怎么没被返回呢??';
};

console.log(fn());

所以的是 undefined

var number = 

var result =  + number

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

// 报错 number is not a function

这种情况,解释器会以为是要 number,但 number 是个数值,并不是,所以报错了,这段被处理后,可能是这样的:

var number = ;

var result =  + number(function() {
  console.log();
})();

碰到这个问题的大部分场景都是写自执行的匿名,所以通常不写分号的情况下,要养成在自执行匿名前写分号的习惯:

var number = 

var result =  + number

;(function() {
  console.log()
})()
var number = 

var result =  + number

[, , ].forEach(function(item) {
  result += item
})

// 报错:Cannot read property 'forEach' of undefined

这个报错原因和上点类似,也是 number 被误当作有成员的对象或者数组了,上面被处理后可能是这样的:

var number = ;

var result =  + number[, , ].forEach(function(item) {
  result += item;
});

显然 number[3] 是取不到东西的。

其他还有许许多多情况,场景与之都类似,所以在不写分号的时候一定要注意,条件允许的情况下借助 eslint 来帮助检查。


联系我
置顶