2011-07-05 3 views
6

확인,이 날 미치게된다이상한 IE JavaScript 동작/버그를 본 적이 있습니까?

먼저 예를 들어, 아무 문제 없다 : 두 스크립트 요소와 지금

<script> 

window.myvar = 150; 

if (false) { 
    var myvar = 3; 
} 

// This will popup "150" 
alert(myvar) 

</script> 

:

<script> 

window.myvar = 150; 

</script> 

<script> 

if (false) { 
    var myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 

는 IE8로 테스트.

이유가 궁금하십니까?

+0

이 테스트시겠습니까 모든 브라우저에서 정의되지 않은 경고가 표시됩니다, 그래서 내가 할 수있는 당신의 질문에 대답합니까? 나는 지금 내 Windows 상자를 사용하지 않기 때문에 테스트 할 수 없습니다. Ad @ m – kirb

+0

IE8을 테스트 해보고 싶습니다. 'myvar'의 정의와 같은 소리가 들려와 '창'의 재산을 가리고 있습니다. – alex

+0

@adam IE7/8에서 코드 테스트가 정상적으로 작동하면 100 – clairesuzy

답변

4

번째 예 내부 script 번째 블록에서 myvar의 함유 범위의 상단 (사양에 따라)를 hoisted왔다. 자바 스크립트에는 블록 범위가없고 함수 범위 만 있다는 것을 기억하십시오.

따라서, var myvar (해석됩니다 게양 정의)이 alert()VariableObjectmyvar를 조회 할 때 myvarundefined 인으로 이어질 것입니다.

+0

아직 명확하지 않다, 무엇이 hoisted? –

+0

@sushil 호이스트에 대해 자세히 설명하는 링크를 추가했습니다. – alex

+0

감사합니다. 이제는 분명합니다. – Claudio

0

이것은 4.3.1의 iOS Safari에서 나에게 발생하지 않으므로 IE의 버그 일 수 있습니다. 그러나 @ 알렉스의 대답도 사실 일 수 있습니다. 광고 @ m

0

나는 호이스트 용으로 알렉스가 말했다. 컴파일러는 블록에 myvar (var myvar 내부에 if)을 정의하고 이전에 알려진 myvar을 호이스트로 간주합니다. 그래도 버그인지 기능인지 확실하지 않습니다. 의

3

때문에 자바 스크립트 기능 수준에 따라 범위는 코드는 다음과 동일/컴파일/계산 않기 때문에 그가 내 기사를 참조하더라도 (밝혔다

<script> 

window.myvar = 150; 

</script> 

<script> 
var myvar; 

if (false) { 
    myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 
+0

그래, 다른 브라우저에서 다르게 작동하는 이유를 모르겠다. 이것은 가변 호이 스팅과 관련이있다. 그래도 IE에서만 보입니다. – Claudio

+0

jsbin 예 : http://jsbin.com/upexat/6/edit#source 및 다른 버전 http://jsbin.com/upexat/8/edit#source – Ajaxe

1

알렉스보다 너무 조금 더 그것을있다을 - 감사!).

"window.myvar = 150"이 처음 정의 된 이기 때문에 "var myVar"가 호이스트되지 않습니다 (또는 호이스트가 효과가 없음) 첫 번째 예제가 효과가 있고 두 번째 예제가 IE에서만 실패한 이유를 설명하십시오)

두 번째 스크립트가 첫 번째 스크립트보다 먼저로드되는 것처럼 보입니다 (단, IE8에서만 나타납니다). 당신은 태그 순서를 전환 시뮬레이션 할 수 있습니다 당신은 http://tinypaste.com/49c80의 코드는 위와 같은 오류가 표시되면

var myvar; 

if (false) { 
    myvar = 3; 
} 

alert(myvar) 

window.myvar = 150; 
관련 문제