【问题标题】:Why does adding a semicolon make this code work? [duplicate]为什么添加分号会使此代码起作用? [复制]
【发布时间】:2017-11-17 06:11:31
【问题描述】:
process.on('exit', function () {
    console.log("Exiting normally")
})

process.on('uncaughtException', function (err) {
    console.log("Caught - " + err)
})

[1,2,3,4,5].forEach(function(element) {
    console.log("Loop " + element)
})

这打破了:

捕获 - 类型错误:无法读取未定义的属性“forEach”

正常退出

而当我添加分号时,它会起作用:

process.on('exit', function () {
    console.log("Exiting normally")
})

process.on('uncaughtException', function (err) {
    console.log("Caught - " + err)
}); // Added semi colon here

[1,2,3,4,5].forEach(function(element) {
    console.log("Loop " + element)
})

这是否意味着为了安全起见,我应该在每条语句后使用分号?

【问题讨论】:

  • process.on 不以行终止符 } 结尾,因此不会发生自动分号插入。
  • 因为 JavaScript 很傻,除非你明确地用分号结束语句,否则它会假设一些事情。它现在假定尖括号是前一个语句的索引。是的,使用分号是阻止这种情况的好方法。
  • 一般来说,你应该用分号结束你的语句。 stackoverflow.com/questions/444080/…
  • 只有在理解自动分号插入的情况下才允许人们省略分号。 “这是否意味着为了安全起见,我应该在每条语句后使用分号?”语法规则实际上规定expression statements are terminated with a semicolon。
  • 这就是为什么大多数 linter 会给你一个关于在数组文字上使用方法的警告,即[...].method()

标签: javascript node.js


【解决方案1】:

假设你有一个函数returnArray(),它返回一个数组,你猜对了。

假设您拨打了这个电话:

#do stuff
returnArray();
[n].blah
#do other stuff
#this returns an array. say [1,2,3,4,5];
#and in the next line it does [n].blah

现在假设您在没有分号的情况下进行相同的调用

#do stuff
returnArray()
[n].blah
#do stuff
#this effectively does [1,2,3,4,5][n]
#which is the nth index element of the returned array.

这类似于获取返回数组的第 n 个索引,这通常不是您想要做的。

【讨论】:

    【解决方案2】:

    当您不使用分号 javascript 时,请按以下方式考虑

    process.on('',function (err) {..})[1,2,3,4,5].forEach(function(element) {
        console.log("Loop " + element)
    })
    

    不知不觉 process.on() 没有像 [1,2,3,4,5] 这样的任何属性,这就是它未定义的原因

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2014-09-26
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多