【问题标题】:JavaScript: why .forEach doesn't work?JavaScript:为什么 .forEach 不起作用?
【发布时间】:2013-05-31 18:00:33
【问题描述】:

这是一小段代码:

window.addEventListener('load', function() {
    ['echo'].forEach(function(entity) {
        console.log('loaded entity=' + entity)
    })
})

console.log(['echo'])
console.log(['echo'].forEach)
['echo'].forEach(function(entity) {
    console.log('entity=' + entity)
})

输出如下所示:

["echo"]
function forEach() { [native code] }
Uncaught TypeError: Cannot read property 'echo' of undefined
loaded entity=echo

为什么会出现这个错误?我假设undefined 在.forEach 中是this。为什么调用.forEach时不通过?

【问题讨论】:

  • 所有浏览器都出现同样的错误??

标签: javascript foreach undefined


【解决方案1】:

分号!

window.addEventListener('load', function() {
    ['echo'].forEach(function(entity) {
        console.log('loaded entity=' + entity);
    })
});

console.log(['echo']);
console.log(['echo'].forEach);
['echo'].forEach(function(entity) {
    console.log('entity=' + entity);
});

问题出在这里:

console.log(['echo'].forEach)
['echo'].forEach(function(entity) {

换行符被忽略,它被解析为:

console.log(['echo'].forEach)['echo'].forEach(function(entity) {

console.log() 返回undefined,undefined['echo'] 引发异常。

因此,请使用分号并感到高兴。或者不要和受苦。

【讨论】:

  • 啊,是的。如果没有分号,JavaScript 将继续解析。不要依赖它们的自动添加。
  • 这是我第一次遇到不加分号的问题。这是一个严重的问题。谢谢。
  • 我很想听听那些提倡在 JS 中不使用分号的人,他们现在会说什么。多亏了这个愚蠢的想法,新的 JS 开发人员看到没有分号的代码,不要使用它们,然后就会发生这种情况。当然,不使用分号时也有一些规则可以防止此类问题发生,但首先必须学习它们。而且通常我们学得太晚了。
【解决方案2】:

You need to add semi-colons。您的脚本正在评估为:

console.log(['echo'].forEach)['echo'].forEach(function(entity) {
    console.log('entity=' + entity)
})

由于console.log 返回undefined,你会得到一个未捕获的TypeError,因为你无法访问undefined 上的echo 属性。

【讨论】:

    【解决方案3】:

    Javascript 可以在没有分号的情况下工作(将换行符视为语句的结尾),只要以下行的连接在语法上不正确且解析没有意义。

    例如:

    var a=1
    var b=2
    

    会起作用,因为分号将被添加为var a=1 var b=2 没有意义。

    因此它将被视为var a=1; var b=2。同样,

    console.log(['echo'].forEach)
    ['echo'].forEach(function(entity) {
        console.log('entity=' + entity)
    })
    

    读作:

    console.log(['echo'].forEach)['echo'].forEach(function(entity) {
        console.log('entity=' + entity)
    })
    

    这里console.log(...) 被视为具有'echo' 属性的对象。因此出现错误。

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2020-12-27
      • 2021-08-03
      • 2014-05-29
      • 1970-01-01
      • 2023-01-12
      • 2015-09-05
      相关资源
      最近更新 更多