2011-02-17 3 views
1

가능한 중복 :
Are there legitimate uses for JavaScript's “with” statement?with 키워드는 javascript에서 좋지 않습니까?

자바 스크립트의 나쁜 일부가 될 수 있지만,이 조각을보고있는 것으로 간주 "자바 스크립트 좋은 부품", with에서

:

var foo={foof:function(){console.log(this)}} 
var fuu={fuuf:function(){console.log(this)}} 
with(foo){ 
    console.log(this); 
with(fuu){ 
    console.log(this); 
    foof(); 
    fuuf(); 
} 
} 

with은 정말 그렇게 나쁜 습관입니까? with 가끔 재미를 줄 수 있습니까? 예를 들어 줄 수있는 사람이 있습니까?

+0

'with'는'this' 포인터를 변경하지 않습니다. 질문이 뭐야? –

답변

1

with의 문제는 다소 모호한 것입니다. 예를 들어, foof() 함수 호출은 다른 곳에서 정의 된 함수 일 수도 있습니다. 사용중인 것을 한 눈에 볼 수 없습니다.

5

그래도 편리하지만 문제를 빨리 해결할 수있는 근본적인 문제가 있습니다. 다음을 고려하십시오 :

var foo={foof:function(){console.log(this)}} 
var fuu={fuuf:function(){console.log(this)}} 
with(foo){ 
    console.log(this); 
with(fuu){ 
    console.log(this); 
    foof(); 
    fuuf(); 
} 
myProp = "blah"; 
} 

이제 myProp으로 지정했을 때 어떤 일이 발생 했습니까?

알기 힘듭니다.

foo의 속성이 myProp 인 경우이 값은 "blah"입니다. 그러나 그렇지 않은 경우에는 "blah"을 전체 개체의 myProp (아마도 window)에 할당했습니다. 이 간단한 예제에서 무슨 일이 벌어지고 있는지 쉽게 알 수 있지만, foo이 1000 라인 더 일찍 정의 되었다면 어떨까요? 아니면 다른 파일에 있습니까? 그렇게 쉬운 것은 아닙니다.

더 많은 정보를 원하시면 여기 질문에 대한 실제 대답 : 여기

Are there legitimate uses for JavaScript's "with" statement?

그리고 :

http://www.yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

+1

이것은 전적으로 훨씬 더 숙련되고 지능적인 사람들이 가지고있는 대중적인 의견이지만, 나는 정말로 동의하지 않습니다. 기본적으로, 당신이 설명하는 것은 1 %의 경우입니다. 극단적 인 상황에서 끔찍한 일들을 할 수 있기 때문에 무언가를 금지하고 명확하고 읽기 쉬운 코드를 작성하고 있다면 스스로에게 자문 해보십시오. 즉, 중첩 된 것을 사용할 경우를 생각할 수 없습니다. 어쨌든, 문제의 좋은 설명, +1 –

+0

대부분의 경우 거의 동일한 일을 수행하는 더 안전한 방법이 없다면 동의 할 수도 있습니다. 깊게 중첩 된 객체를 var에 할당하면됩니다 :'var o = some.long.string.of.props; o.whatever' ... –

+0

하지만, 한 줄 조건부에 중괄호를 사용하지 않는 것이 좋다고 생각합니다. (사람들이 나도 잘못 생각한다고해서 지쳤습니다). 그럼 내가 뭘 안다고? –

0

내가 예를 들어 줄 수는, 존은 resigs 간단한 (그리고 격렬하게 인기) client side templating function.

<editorial>
좋은 부분은 삶을 변화시키는 경이로운 책이지만 crockford는 오류가 없으며 진실로 끔찍한 일이라고 말하는 동일한 권위로 나쁜 말을하는 경우가 많습니다. 전체 암시적인 전역/명시 적 로컬 객체와 마찬가지로) 나쁜 것입니다.
<editorial>

with에 문제는 기본적으로 MDC 페이지

function f(x, o) { 
    with (o) 
    print(x); 
} 

에 해결되어, x의 값은 실행 시간까지 모호합니다. o에 x라는 속성이 있으면 x가 해당 속성이됩니다. 그렇지 않다면 x가 전달 될 것입니다. 즉, 코드를 읽는 개발자는 x가 의미하는 바를 알아내는 데 어려움을 겪을 수 있습니다. 더 중요한 것은 JS 해석자가 특정 종류의 최적화를 적용 할 수 없으면 에.

<opinion>

지금 개인적으로, 나는 완벽하게 읽을 수와 발견, 나는 이제까지 변수에게 그들이 위의 예에서 명명되는 방법을 이름을하지 않을 것, 그래서 가독성과 모호함 인수 개판을 찾을 수 있습니다. perf 인수에 관해서는, 우리가 어리석은 짓을하는 것이 아니라면 (블록 내부에 앱을 절반 씩 가지고있는 것처럼), 대부분 조기 최적화에 대한 논쟁입니다. 여기서 당신은 실제로 측정 할 수없는 양의 낭비되는 시간에 대해 이야기하고 있습니다. 실제 시나리오. 나는 대안이 훨씬 더 많거나 덜 읽을 수있는 코드가 대안이 될 때만 실제로 사용되어야 할 상황 별 언어 기능이라고 생각합니다.
</opinion>

관련 문제