2017-04-17 6 views
0

나는 이것을 사용하기 전에 with을 사용하는 것이 좋습니다. 나는 그것이 어떻게 작동 하는지를 배우기에 호기심이있다. (자바 스크립트에서 범위를 파악하려고한다).With 블록의 변수 선언

나는이 같은 일부 코드가있는 경우 :이 같은 뭔가 foo는 변경하는 경우, 그러나

function foo(obj) { 
    with (obj) { 
     b = 2; 
    } 
} 

var o1 = { 
    a: "something" 
}; 

foo(o1); 
console.log(o1.b) // This outputs undefined (makes sense) 
console.log(b) // This outputs 2 (makes sense) 

을 :

function foo(obj) { 
    with (obj) { 
     var b = 2; // I use var b instead of b 
    } 
} 

내가 foo는에 O1 전달, 다시, O1은 더이 없습니다 속성 b. 왜 이런거야? 나는 var을 사용하여 obj의 범위 안에 b를 선언 했으므로, 속성은 전역 범위 대신 o1 내부에 만들어 질 것이라고 생각했습니다.

답변

2

var 선언문이 게양되었습니다. 그래서 당신이 실행하는 것은 선언이 with 블록 내부에 있다는 문제가되지 않는다

function foo(obj) { 
    var b; 
    with (obj) { 
     b = 2; 
    } 
} 

에 해당합니다. §9.2.12은 함수 본문을 평가할 때 수행되는 작업을 설명합니다. 11/12 단계에서 모든 변수 선언이 수집됩니다. with 문은 단순히 내부의 모든 선언 (see spec)을 "전달"합니다.

1

변수 선언 (var 사용)은 블록 범위를 고려하지 않고 대신 범위 상단에 hoisted입니다. 컴파일러/인터프리터에 관한 한 실제로 코드는 다음과 같습니다.

function foo(obj) { 
    var b = undefined; 
    with (obj) { 
     b = 2; 
    } 
}