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

なぜこのエラーが発生するのですか? の中にundefinedあると思います。を呼び出すときに渡されないのはなぜですか?this.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()を返しundefinedundefined['echo']例外を発生させます。

したがって、セミコロンを使用して満足してください。またはしないでください。

于 2013-05-31T18:03:24.413 に答える
1

セミコロンを追加する必要があります。あなたのスクリプトは次のように評価されています:

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

また、console.logが返されたため、 のプロパティにundefinedアクセスできないため、キャッチされていない TypeError が返されます。echoundefined

于 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 に答える