2017-11-27 13 views
0

を示しています。私は次のことを試した最初の試験ではブロックのスコープは、私がES6上のブロックスコープを理解しようとすると、次の問題(多分私はちょうど概念を誤解しています)が見つかりてる異なるエラー

をし、コメントエラーました:

{ 
    const x = 2; 
    console.log(x); //2 
    { 
     let x = "b"; 
     console.log(x); //b 
     { 
      var x = true; //Identifier 'x' has already been declared 
     } 
    } 

} 
console.log(x) 

をしかし、私は「すでに宣言」の種類を取得しようとすると、X私が取得:

{ 
    const x = 2; 
    console.log(x); //2 
    { 
     let x = "b"; 
     console.log(x); //b 
     { 
      console.log(typeof x); //this throws Uncaught ReferenceError: x is not defined 
     } 
    } 

} 
console.log(x); 

私は何が起こっているかを確認するために努力を続けるだろう、任意のアイデア受け入れられる。

+0

罰金それは上記のいずれかを見てブロック何が起こったのかを知るためのヒント – CRz

答えて

0

まず第一に、あなたはの違いを知っておく必要がありVAR

let allows you to declare variables that are limited in scope to the block, statement, or expression on which it is used. This is unlike the var keyword, which defines a variable globally, or locally to an entire function regardless of block scope. An explanation of why the name "let" was chosen can be found here. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

セカンドを聞かせてあなたは既にので、あなたが「できる「×ましょう」があるので、あなたは、このエラー"Identifier 'x' has already been declared"を得ました"var x"を使用してください。しかし、varをletに変更すると、それが動作します。スコープを理解する

例:心に留めておいてください

function test() {  // first scope 
    let x = 1; 
    let y = 2; 
    console.log(x, y); //1 2 

    function test2() { // second scope 
    let x = 2; 
    let z = 3; 
    console.log(x,y,z); //2 2 3 

    } 
    test2(); 
    console.log(z); //z is not defined... notice z is defined in the second scope, not the first one 
} 
test(); 

を、あなたは、内側のスコープで高い/グローバルスコープから変数にアクセスすることができますが、高い/グローバルスコープで、内側のスコープからの変数にアクセスすることはできません。

これを読む:What is the scope of variables in JavaScript?

EDIT:あなたがこれを行う場合は

、それが動作するはずです私は宣言せずにtypeof演算を試してみました

const x = 2; 
console.log(x); //2 
{ 
    let x = "b"; 
    console.log(x); //b 
    { 
     x = true; 
    } 
} 
console.log(x) 

OR

const x = 2; 
console.log(x); //2 
{ 
    let x = "b"; 
    console.log(x); //b 
    { 
     let x = true; 
    } 
} 
console.log(x) 
+0

あなたの答え@ moe-kananありがとう。私は概念と相違点を読んで理解していますが、この場合、エラーの正確な原因と理由を知りたいと思います。私は、内側のx(var)をグローバルにすることができますが、なぜこの特定の動作を示しているのか分かりません。 – CRz

+0

@CRz最新の回答を確認してください。 –

+0

はい私はいくつかの他のシナリオ(ループの場合)をテストし、** let **の下の** var **が同じエラーを表示するように見えましたが、機能はうまくいきました。私はスペックの一部だと思うが、ドキュメントの直接の回答を見つけることができなかった、私はこれを解決すると思います。 – CRz

2

実際、エラーは最終的なconsole.log(x);に由来します。その行を削除すると、コードは正常に動作します。

このエラーは理にかなっています。 xは内部ブロックでのみ定義されます。外側のスコープには存在しません。

+0

この場合、参照エラーが発生し、そのエラーを取り除くと同じ結果が得られます。私はエラーがusinr "var"のためであることを知っているが、今は正確な答えではない。 – CRz

関連する問題