2017-09-29 8 views
0

코드로 가정하면 두 번째 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은 block-scoped 인 것을 알고있다 – 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 리프팅된다. 그래서 결론은 동일한 범위에서 동일한 변수를 두 번 이상 선언 할 수 없다는 것입니다.

자바 스크립트에서 가변적이고 게양에 대한 추가 읽기 위해 당신은 확인할 수 있습니다

+1

''if (condition)'비트를 꺼낼 수 있습니다. 예. 이것은 괜찮습니다. {let x = 0; {let x = 0; }}' – Keith

+1

이것은 잘못되었습니다. 'let' /'const'에는 호이스트가 없습니다. 이 문제는 두 번째'let' 선언과 같은 범위에있는'x' 인자로 인해 발생합니다. 'let' /'const'는 같은 범위 안에서 한번만 이름 ('x')을 바인딩 할 수 있음을 의미합니다. – 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);