2014-09-10 7 views
7

Ho iniziato a utilizzare JS Promises in un progetto di recente. Ho notato che ogni volta che uso .catch i miei reclami JS linter. Funziona e fa quello che dovrebbe, ma ho cercato il ECMAScript spec e sembra davvero che sia giusto: dal catch is a keyword non può essere usato come identificatore. Mi pare di capire i nomi dei metodi sono identificatori, quindi questo non è valido:Il nome del metodo 'catch' di JS Promises/A + non è valido poiché si tratta di una parola chiave JS?

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

dovrebbe essere questo, invece:

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

Che cosa mi manca?

+0

i browser che non seguono le specifiche ecmaScript potrebbero sembrare diversi rispetto a quelli che lo fanno. – dandavis

+2

Il linter si lamenta probabilmente perché cerca di essere compatibile con ES3. –

+2

Correlati: [Supporto browser per l'utilizzo di una parola riservata come nome di proprietà in JavaScript] (http://stackoverflow.com/q/5306315/218196) ... Kangax: http://kangax.github.io/compat- table/es5/# Reserved_words_as_property_names –

risposta

13

Cosa mi manca?

Un nome di proprietà non è un identificatore, può utilizzare qualsiasi nome di identificatore. Dal spec su Property Accessors:

MemberExpression : MemberExpression . IdentifierName 
CallExpression : CallExpression . IdentifierName 

e identifiers:

Identifier :: IdentifierName but not ReservedWord 

È possibile utilizzare qualsiasi nome arbitrario identificatore (ma non le cose come numeri interi), in un accesso di proprietà di punti, ma non è possibile utilizzare quelli che sono [riservato] parole chiave come identificatore, ad es in un nome di variabile o funzione.

Tuttavia, questo è cambiato con ES5, di nuovo in EcmaScript 3 i nomi delle proprietà dovevano essere identiers. Ecco perché è ancora necessario utilizzare la notazione della parentesi per le parole chiave se si desidera supportare i browser legacy; ed è il motivo per cui il tuo linter si lamenta. Same holds per i nomi delle proprietà nei letterali degli oggetti.

+0

Non sono sicuro perché sia ​​stato downvoted, è una risposta corretta. +1 – zerkms

+1

bene, corregge un problema di semantica con la domanda (sulla parola "identificatore"), ma non risponde sul perché l'avviso o su IE8. (ma non ho fatto un downvote) – dandavis

+1

Ho downvoted perché la risposta originale era una risposta molto scarsa e breve che non fornisce molte informazioni. Rimosso il downvote anche se le modifiche successive erano molto migliori. – Evert

Problemi correlati