2017-12-14 14 views
0

この動作は奇妙です。Chromeでこのループで変数を宣言するのはなぜですか?

myObjects = [ 
    { 
    name: 'List 1', 
    invitations: [ 
     { email: '[email protected]', stamp: '1234' }, 
     { email: '[email protected]', stamp: '4576' } 
    ] 
    }, 
    { 
    name: 'List 2', 
    invitations: [ 
     { email: '[email protected]', stamp: '5678' }, 
     { email: '[email protected]', stamp: '6789' } 
    ] 
    }, 
] 

私は招待状の配列は、特定の電子メールアドレスが含まれるオブジェクトをフィルタリングする必要があるので、私はこれをやっている、私は崇高でそれをテストしたときに素晴らしい作品:私はこのようになりますオブジェクトの配列を持っていますテキスト:

filteredObjects = myObjects.filter(obj => { 
    for (var invitation of obj.invitations) { 
    if (invitation.email == '[email protected]') return true; 
    } 
}); 
:私はChromeでこれを実行しようとした場合

filteredObjects = myObjects.filter(obj => { 
    for (invitation of obj.invitations) { 
    if (invitation.email == '[email protected]') return true; 
    } 
}); 

// [ { name: 'List 2', invitations: [ [Object], [Object] ] } ] 

しかし、私が(ループのために追加された「VAR」に注意してください)何らかの理由で、forループで変数を宣言することです

私は(「VAR」との)変数を宣言しない場合、私は私のクロームコンソールにエラーが表示されます。

Uncaught (in promise) ReferenceError: invitation is not defined 

私はこれが起こっている理由を理解したい、そしておそらく書くためのより良い方法があるかどう私のフィルター。

+2

「招待状」を宣言していない場合、それは何を参照していますか? –

+5

どこか厳密に使用していますか? – dgrogan

+0

グローバルスコープに同じ名前の別の変数があるかどうか尋ねていますか?そこにはありません、私はそれが衝突の問題ではないことを確認するためにいくつかのランダム変数名を試してみました。 – Alan

答えて

1

Chromeで変数invitationを宣言する必要がある場合は、暗黙的または偶発的なグローバル変数が無効になっているためです。これは、Chromeがstrictモードとみなすセクションにあるためです。 strictモードとしてコードを扱っている理由を正確に識別するためには、より大きなコード・コンテキストを表示する必要があります。

矢印機能団体をstrictモードで自動的に作成したブラウザ(Firefoxの矢印機能の初期バージョンなど)が実装されていますが、これは標準の一部ではありません。あるいは、フィルタ文が入っているこのより大きいコードコンテキストは、何らかの理由で厳密なモードになっている可能性があります。

これは非常に良いことです。すべての変数は、意図した範囲で明示的に宣言する必要があります。偶発的、暗黙的、または自動的なグローバル変数を含むコードを書くことは、偶然、矛盾するグローバル変数を作成して使用するためのレシピです。動作中に断続的に発生する可能性のあるバグを追跡することは困難です(特に非同期操作に関係する場合)。

厳密モードが自動的に実行されます

  1. Anywhereは、コードを手動関数スコープの上部に'use strict';strictモードであると宣言されます。

  2. ES6 Class構文で宣言されたメソッドは、自動的にstrictモードになります。

あなたはthis article on MDNthis article on using Classでstrictモードの影響の完全なリストを見ることができます。

+0

ありがとうございます。上記のコメントの一部を確認した後、コードをコピーしてChromeコンソールに直接貼り付けると宣言せずに正常に動作するため、バンドル時にウェブパックで何か起こっている可能性が高いと判断しました。しかし、webpackはChromeの厳密なモードを引き起こす何かをしている可能性があり、その宣言されていない変数に到達するとエラーになります。学んだ教訓。常に宣言する。 – Alan

+0

@Alan - それはおそらく聞こえます。コードジェネレータは、厳密なルールに従って厳密に厳密なモードでコードを実行するのが好きです。あなたは生成されたコードを見て、それを引き起こしているものを正確に見るか、あるいは結論としてそれをそのまま見ることができます。 – jfriend00

関連する問題