2010-03-26 7 views
10

ASP.NET MVC를 사용하여 JavaScript를 작성하는 동안 여러 범위 경고가 나타 났으며 switch/case 문 내부의 변수 범위를 이해하지 못했습니다.switch/case 문에서 JavaScript 변수 범위는 무엇입니까?

은 경고 : 나는 범위는 각 break 문으로 종료하지만 보인다 생각

switch(element) { 
    case 'a': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 

    case 'b': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 

    case 'c': 
    for(var i=0; i < count; i++){ 
    do something 
    } 
    break; 
} 

: '나는'이 (가) 이미

내 코드는 다음과 유사 c를 사례 B와 사례를 참조를 정의 그 범위는 스위치/케이스의 끝까지 끝나지 않습니다. 전체 스위치/케이스의 스코프입니까?

답변

15

자바 스크립트는 블록 범위를 사용하지 않습니다.

따라서 모든 로컬 변수는 선언 된 전체 함수에서 유효합니다.

그러나 특별한 경우에 각 case 문이 독립적 인 범위를 형성하는 C와 유사한 언어는 없습니다.
예를 들어, 다음 C# 코드는 컴파일되지 않습니다 : 자바 스크립트 블록 범위를했다하더라도

이 좀 case 당 범위를 갖는 개념 자격을 상실 가을-을 통해 기능
switch(someVar) { 
    case 1: 
     int a; 
     break; 
    case 2: 
     int a;  //'a' is already defined 
     break; 
} 
+0

예. 언뜻보기에 옳은 것처럼 보였으므로 나는 이걸 잠 들었어야합니다. 그러나 컴파일러 경고 때문에 내가 잠 들어있을 때 알려주는 기쁨. 훌륭한 답변을 해주셔서 감사합니다. –

+3

C 언어와 같은 언어 (Javascript가 아님)로 다음과 같은 경우에 사용자가 직접 스코프를 생성 할 수 있습니다 :'case 1 : {...}' – hugomg

+0

FYI, 요즘 ES6 구문은 블록 범위 지정을 허용하므로 대소 문자를 구분하여 범위를 만들 수 있습니다. –

4

전체 스위치/케이스의 스코프가 맞습니까?

아니요, 기능을 포함하지 않는 경우 전체 기능 또는 전역 범위 용입니다.

(가 자바 스크립트를 추가 범위를 소개하는 애매한 몇 가지 경우가 있지만, 그것에 대해입니다.)

경고 : '나는'이 (가) 이미

난 정말 동의하지 않는 정의 이 경고와 함께. 블록의 독립적 인 변수 인 i을 그대로 사용하여 코드를 그대로 두는 편이 낫습니다. 그것은 당신이 원하는 무엇

는 첫 번째 선언 제외한 모든에서 var을 제거, 아니면 스위치 전에 var i를 추가하고 모든 for의에서 var을 제거합니다. 그러나 이제는 그 블록이 혼자 서 있지 않고 신속하게 잘라 내기 및 붙여 넣기 (예 : 을 별도의 function으로 리팩토링)하면 var으로 선언되지 않은 i을 참조하는 루프가 생깁니다. 이것은 우발적 인 글로벌이며, 디버깅하는 데 실제로 고통 스러울 수있는 끔찍한 JS 함정입니다.

JSLint는 동일한 불만을 제기합니다. 나는 그것을 무시할 것이다. 한 블록에 변수 var을 두 번 선언해도 아무런 해가 없습니다.

+0

예 작동하는 것으로 알고 있습니다. 나는 프로덕션 코드에서 경고를받는 것을 좋아하지 않는다. 그러나 여기에 대한 사무실의 이야기는 jQuery가 똑같은 기능을한다는 것을 밝혀 냈습니다. 그래서 나는 그것을 떠날지도 모른다. 좋은 대답에 감사드립니다. –

관련 문제