3

这是一小段代码:

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

为什么会出现这个错误?我假设那undefinedthis在里面.forEach。为什么调用时不通过.forEach

4

3 回答 3

7

分号!

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']引发异常。

所以使用分号并快乐。或者不要和受苦。

于 2013-05-31T18:03:24.413 回答
1

您需要添加分号。您的脚本被评估为:

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

并且由于console.log返回undefined,您会得到一个未捕获的 TypeError,因为您无法echo访问undefined.

于 2013-05-31T18:03:47.773 回答
0

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'。因此错误。

于 2013-05-31T18:09:07.943 回答