2012-10-03 3 views
2

이것은 매우 고안된 예이지만 클래스 함수 어딘가에 변수 _this을 생성한다고 가정 해 봅시다._this라는 변수를 생성하면이 변수와 충돌해야합니까?

class Person { 
    constructor (public name : string) {} 
    changeName(name) { 
    var _this = {}; 
    (() => { 
     this.name = name; 
    })(); 
    } 
} 

예상대로 컴파일 된 코드의 관련 부분은 다음과 같이 보이기 때문에 우리가 changeName 함수를 호출 할 때이 작동하지 않습니다 :

var _this = this; 
var _this = {}; 
(function() { 
    _this.name = name; 
})(); 

이 나쁜 자바 스크립트입니다 : 우리가 서로를 덮어 두 var 선언이 다른. 컴파일러에서 만든 _this이 내 _this으로 덮어 쓰여지고 있습니다.

내가 볼 수있는 한,이 동작은 TypeScript 사양에 지정되어 있지 않습니다.

왜 충돌해야합니까? 컴파일러가 _this이라는 변수를 생성하고 내 변수와 컴파일러에서 생성 한 변수를 서로 짓밟지 않도록 _this2과 같이 자동으로 생성 된 변수를 자동으로 생성했는지 감지 할 수 있습니까?

+2

이것은 나에게 매우 심각한 문제처럼 보입니다. 최소한 언어 사양으로 다루어야합니다. 공식 응답을 위해 [TypeScript issue tracker] (http://typescript.codeplex.com/workitem/list/basic)에 게시하는 것이 좋습니다. – joshuapoehls

답변

7

컴파일러는 람다 구문을 사용하여 작성되는 클로저를 용이하게하기 위해 this에 대한 참조로 자동으로 _this을 작성합니다. 나는 TypeScript 명세에서 이것을 어딘가에 읽었을 것이라 확신하지만이 경우에는 컴파일러가 오류를 내야한다는 것에 동의한다.

저는 "관용적"(그러므로 예측 가능한) 자바 스크립트를 생성하는 명시된 목표와 충돌하기 때문에 컴파일러가 자바 스크립트를 내보내는 방식이 다양하다는 생각을 좋아하지 않습니다.

0

예약 된 변수는 무엇입니까? 나는 당신이 "this"또는 "document"라고 불리는 변수를 선언하지 않을 것이라고 생각한다.

예약 변수가 무엇인지 MS가 분명하면 중요한 문제가 있다고 생각하지 않습니다. 아마도 경고를 출력하기 위해 컴파일러를 향상시킬 수 있습니다.

+1

내가 볼 수있는 한 그것은 예약 변수로 문서화되어 있지 않습니다. 경고 나 오류를 출력하지 않습니다. –

+0

마찬가지로, JavaScript에는'document'라는 변수를 선언하지 못합니다. 그러나 브라우저 환경에서는'document'가 호스트 변수로 존재하므로 다시 할당 할 수 없습니다. –