2010-03-29 4 views
19

with으로 시작하는 JavaScript 코드를 발견했습니다. 그것은 다소 혼란 스럽습니다. 그것은 무엇을하며 어떻게 올바르게 사용할 수 있습니까?"with"는 JavaScript에서 무엇을합니까?

return sObj.options[selectedIndex].value; 

가 될 수 있습니다 :

with (sObj) return options[selectedIndex].value; 

답변

22

이 블록에 포함 된 문장의 범위에 추가

귀하의 경우에는
with (sObj) 
    return options[selectedIndex].value; 

, 그것은 훨씬을 넣은 사람은 아니다. .. 다음을 고려하십시오 :

var a, x, y; 
var r = 10; 
a = Math.PI * r * r; 
x = r * Math.cos(PI); 
y = r * Math.sin(PI /2); 

되십시오 :

var a, x, y; 
var r = 10; 
with (Math) { 
    a = PI * r * r; 
    x = r * cos(PI); 
    y = r * sin(PI/2); 
} 

... 몇 가지 키 입력이 저장됩니다. 모질라 문서가 실제로 (장점과 그것을 사용의 단점과 함께) 좀 더 구체적으로 일을 설명 꽤 좋은 직장을 수행

with - Mozilla Developer Center

+0

VBA와 마찬가지로 사용이 불편합니다. 파이썬에서는 일회용 객체를 정리할 수 있습니다. C#에서는 using이라고 부릅니다. –

+0

+1 - 안녕 저스틴 - 좋은 설명 –

+0

@ 마크 - 감사. 그래도이 '사용하지 않기를 제안'조항을 포함시켜야하는 것 같습니다. –

1

나는 때문에 성능 문제의이를 사용하지 않는 것이 좋습니다,하지만 것입니다 무슨 위의 수단은 다음과 같습니다 : (여기서는 아마도 선택 요소 임)

(이 요소는 아마도 선택 요소 임)이 개체에서 참조되는 모든 자식 및 속성은 중괄호 사이에서 부모 범위로 처리됩니다.

1

이것은 (편집하기 전에 제목 제목에 표시된 것처럼) 기능이 아니라 진술입니다. 코드 샘플과 같이 포맷하면 그것은 더 의미가 있습니다

with (sObj){ 
    return options[selectedIndex].value; 
} 

이 (Source를) 무엇에 관한

with 문은 명령문 세트에 대한 기본 객체를 설정합니다. JavaScript는 명령. 세트 내의 규정되지 않은 이름을 찾아 이름이 기본 오브젝트의 특성인지 판별합니다. 규정되지 않은 이름이 특성과 일치하면 특성에서 특성이 사용됩니다. 그렇지 않으면 국지 또는 전역 변수가 사용됩니다.

코드 샘플에서 optionssObj의 속성인지 먼저 확인합니다. 그 다음 경우 optionssObj.options을 의미 그렇지 않으면 이름 options

with 문을 사용의 단점에 의해 정의 된 변수에 대해 다른 범위를 확인 그냥 액세스됩니다 어떤 코드를이기는에서 아는 것은 불가능하다는 것이다.이 입력 필요 없다 블록과 그에서 this article

+0

나머지 답변은 정확하지만 상대적으로 적은 포맷입니다. 그것으로. – belugabob

+0

@ belugabob 그 내용을 추측하기보다는 * 답을 * 읽고 *주십시오. 'with '문과의 관련성이있는 서식을 전혀 언급하지 않았습니다. 중괄호를 사용하여 형식을 지정하면 함수 호출과 비슷하게 보이게하고 문장과 비슷하게 보이므로 더 많은 것을 이해합니다. – Yacoby

+0

@belugabob 오해를 더 어렵게하기 위해 단어 순서를 재 배열했습니다. – Yacoby

2

같이 다른 더 나은 대안은 다음과 같습니다

sObj.options[selectedIndex].value 

을하지만 당신은 사용할 수 있습니다

options[selectedIndex].value 
2

에 해당
return sObj.options[selectedIndex].value; 

With conte에서 문장 블록을 실행할 수 있습니다. 특정 객체의 xt. 따라서 with 블록의 모든 문장은 괄호 안에있는 객체의 구성원으로 간주됩니다.

이렇게하면 변수 참조가 sObj 또는 global 중 하나 일 수 있기 때문에 코드를보다 쉽게 ​​읽을 수 있습니다. 그러나 또한 모호함을 유발할 수 있습니다.

legitimate uses for javascript's "with" statement

: D

9

with 문은 순수 구문 설탕이지만, 그것은 또한 성가신 버그가 발생할 수 있습니다.

는 설명을위한 with Statement Considered Harmful를 참조하십시오 : 당신이 프로그램을 읽고 당신이 그것을 할 것입니다 무엇인지 확신 할 수없는 경우

, 당신은 제대로 작동하는 것입니다 확신을 가질 수 없습니다. 이러한 이유 때문에 with 문은 피해야합니다. 귀하의 예는 다음과 같이 다시 작성할 수 있습니다

+2

++는 'with'의 단점을 언급하기 위해 –

1

... 제공된 객체의 범위에서 문 장소 '와'모든 관련된 계산서 등

return sObj.options[selectedIndex].value; 

...

. 이 경우 꽤 무의미하지만 'sObj'에 대해 많은 작업을 수행하는 경우 많은 타이핑을 절약 할 수 있습니다.

완전히 허구 예를

..

with (sObj) 
{ 
    if(options[selectedIndex].value < 10){ 
     options[selectedIndex].value++; 
     total+ = options[selectedIndex].value; 
    } 
} 

그러나, 그것은 종종 절약 입력이 더 나은 방법으로 달성 할 수있는 경우이다,라고하는 데.