그것은 매우 간단합니다 : JS 현재 범위의 상단에 변수 선언를 게양하지만, (할당 포함) 작업이 없습니다 물론, (같은 범위 내에서 두 번째 사례 설명을 참조하십시오). 그래서 당신의 조각이 VAR을두면
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
로 번역되어, 범위 스캔을 진행 (전역 범위에서 선언되는 변수에 대한 확인).
슬프게도 이렇게하면 var의 첫 번째 사용 컨텍스트가 손실되고 (브랜치 내부에서) 할당이 발생합니다. 암시 된 세계는
으로 번역됩니다.
감사합니다. 사실이 아닙니다. 나는 이것을 확신했다. 콘솔에서 콘솔의 두 가지를 테스트했기 때문에 이것을 가정했다. 이 경우 @amadan이 옳다. 전역 변수 (이것을 게시했을 때 실수로 스 니펫에 greeting
이라고 부름)를 사용하고있다. JS에서 스코프/스코프 스캐닝을 이해할 때 누군가 도움이되기를 바라는 바, 전역 변수가 실제로 무엇인지 보여주기 위해 코드를 아래의 코드 (수정)로 남겨 둘 것입니다.
var currentSize = 'hello';
//well, actually implied globals can be deleted, so it's more like
Object.defineProperty(this,'currentSize',{value:undefined,
writable:true,
enumerable:true,
configurable:true});
(function()
{
if (currentSize == 'hi')//always false
{//this still doesn't get executed
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined
}());
+1 잘 대답하고 명확한 대답. – Aesthete
사실 +1 선생님. –
@bfavaretto :'var greeting'은 에러 였고, var currentSize' 글로벌 변수 선언 (첫 번째 예제에서는 회색 음영으로, 두 번째 예제에서는 회색 음영으로 표시)을 가정했습니다. 그렇지 않으면 예제와 전혀 관련이 없습니다. – Amadan