2017-09-29 3 views
0

コードで私の前提は、2番目のlet xのコードは、時間的不感帯にあることです。したがって、エラーを投げるべきではありません。理解レットスコープ

コード

function f(condition, x) { 
 
    if (condition) { 
 
    let x = 100; 
 
    return x; 
 
    } 
 
    let x = 30; // <---- throw error 
 

 
    return x; 
 
} 
 

 
f(true, 1);

+2

'let'は "ブロックがスコープ" である - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/文/ let –

+1

私はletがブロックスコープであることを知っています – aWebDeveloper

+0

Javascriptでホイストを読むので、あなたの例でどのコードが失敗するのか理解できます。 – Dez

答えて

2

さてここで問題は、あなたが同じfunctionで二回同じ変数xを再宣言しているということなので、変数xが掲揚されます。

if (condition) { 
    //This x declaration is fine as it wasn't preceded with any others declaration inside the same block scope 
    let x = 100; 
    return x; 
    } 
    //Now this second x declaration will cause the hoisting problem 
    let x = 30; // <---- throw error 

ここで二let x = 30;宣言は、あなたのfunctionスコープでx変数を巻き上げています。結論として、同じ変数を同じスコープ内で複数回宣言することはできません。

さらにJavaScriptでvaraible巻上について読むために次のことが確認できます。

+1

'' if(condition) 'ビットを取り出すことができます。例えば。これは良い '{let x = 0; {let x = 0; }} ' – Keith

+1

これは間違っています。 'let' /' const'で吊り上げることはありません。この問題は、渡された引数 'x'によって引き起こされます。これは、第2の' let'宣言と同じスコープにあります。 'let' /' const'は同じスコープ内で名前( 'x')を1回しか束縛できないことを意味します。 – ftor

2

問題は、xすでに外側Xと同じ範囲を持つ関数パラメータされた状態であるように見えます。関数のパラメータxyに変更すると、コードは正常に動作します。

コード

function f(condition, y) { 
 
    if (condition) { 
 
    let x = 100; 
 
    return x; 
 
    } 
 
    let x = 30; // <---- doesnt throw error 
 

 
    return x; 
 
} 
 

 
f(true, 1);