2014-09-10 2 views
7

프로젝트에서 JS 약속을 최근에 사용하기 시작했습니다. 내가 사용할 때마다 .catchJS linter 불평을 발견했습니다. 그것은 실행하고해야 할 일을하지만, 나는 ECMAScript spec을 찾았고 실제로 그것이 옳은 것처럼 보입니다 : catch is a keyword 이후로 식별자로 사용할 수 없습니다. 내가 메소드 이름은 식별자 이해, 그래서 이것은 무효이므로 :JS 약속/catch + 메소드 이름이 JS 키워드이므로 유효하지 않습니까?

Promise.reject("Duh").catch(alert); 

그것은이 대신해야한다 : 나는 무엇을 놓치고

Promise.reject("Duh")['catch'](alert); 

?

+0

ecmaScript 사양을 따르지 않는 브라우저의 느낌이 다를 수 있습니다. – dandavis

+2

lint는 ES3 호환을 시도하기 때문에 불평 할 가능성이 높습니다. –

+2

관련 내용 : [JavaScript에서 예약어를 속성 이름으로 사용하기위한 브라우저 지원] (http://stackoverflow.com/q/5306315/218196) ... Kangax : http://kangax.github.io/compat- table/es5/# Reserved_words_as_property_names –

답변

13

무엇이 누락 되었습니까?

속성 이름은 식별자가 아니며 식별자 이름을 사용할 수 있습니다. Property Accessors의 사양에서 :

MemberExpression : MemberExpression . IdentifierName 
CallExpression : CallExpression . IdentifierName 

identifiers :

Identifier :: IdentifierName but not ReservedWord 

당신은 점 속성 액세스에 임의의 식별자 이름 (그러나 정수 같은 것들)를 사용할 수 있습니다,하지만 당신은 사람들을 사용할 수 없습니다 식별자로 [예약 된] 키워드, 예. 변수 또는 함수 이름.

그러나이 변경 사항은 ES5에서 변경되었으므로 EcmaScript 3 속성 이름은 identier 여야합니다. 그렇기 때문에 레거시 브라우저를 지원하려면 키워드에 대괄호 표기법을 사용해야합니다. 그리고 그것은 당신의 린터가 그것에 대해 불평하는 이유입니다. 객체 리터럴의 속성 이름은 Same holds입니다.

+0

downvoted 이유는 확실하지 않습니다. 정답입니다. +1 – zerkms

+1

음, 질문 (단어 "식별자"에 관한)에 대한 의미 문제를 수정하지만 경고 또는 IE8에 대한 이유에 대해서는 대답하지 않습니다. (그러나 내가 downvote하지 않았다) – dandavis

+1

원래 대답은 많은 정보를 제공하지 않는 매우 가난하고 짧은 대답이기 때문에 나는 downvoted. 후속 편집이 훨씬 더 좋았지 만, downvote를 삭제했습니다. – Evert