2014-09-10 10 views
7

Ich habe kürzlich begonnen, JS Promises in einem Projekt zu verwenden. Ich habe festgestellt, dass jedes Mal, wenn ich .catch meine JS linter beschwert. Es läuft und tut was es sollte, aber ich habe die ECMAScript spec nachgeschlagen und es sieht wirklich so aus, als ob es richtig ist: Seit catch is a keyword kann es nicht als ein Bezeichner verwendet werden. Wie ich verstehe Methodennamen Bezeichner sind, so ist dies ungültig:Ist der Name der Fangmethode von JS Promises/A + ungültig, da es sich um ein JS-Schlüsselwort handelt?

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

Es sollte dies stattdessen sein:

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

Was bin ich?

+0

Browser, die nicht der ecmaScript-Spezifikation folgen, fühlen sich möglicherweise anders an als die, die dies tun. – dandavis

+2

Der Intermediate klagt wahrscheinlich, weil er versucht, ES3-kompatibel zu sein. –

+2

Zugehörig: [Browserunterstützung für die Verwendung eines reservierten Wortes als Eigenschaftsname in JavaScript] (http://stackoverflow.com/q/5306315/218196) ... Kangax: http://kangax.github.io/compat- table/es5/# Reserved_words_as_property_names –

Antwort

13

Was fehlt mir?

Ein Eigenschaftsname ist kein Bezeichner, er kann einen beliebigen Bezeichnernamen verwenden. Von der Spezifikation auf Property Accessors:

MemberExpression : MemberExpression . IdentifierName 
CallExpression : CallExpression . IdentifierName 

und identifiers:

Identifier :: IdentifierName but not ReservedWord 

Sie können jeden beliebigen identifer Namen verwenden (aber nicht Dinge wie ganze Zahlen) in einem Punkteigenschaft Zugang, aber Sie können nicht diejenigen verwenden das sind [reservierte] Schlüsselwörter als Bezeichner, z in einem Variablen- oder Funktionsnamen.

Dies änderte sich jedoch mit ES5, zurück in EcmaScript 3 Eigenschaftsnamen mussten Identities sein. Aus diesem Grund müssen Sie immer noch die Klammernotation für Schlüsselwörter verwenden, wenn Sie ältere Browser unterstützen möchten. und das ist der Grund, warum dein Linter sich darüber beschwert. Same holds für Eigenschaftsnamen in Objektliteralen.

+0

Ich bin mir nicht sicher, warum es abgelehnt wurde, es ist eine korrekte Antwort. +1 – zerkms

+1

Nun, es korrigiert ein Semantik-Problem mit der Frage (über das Wort "Bezeichner"), aber es beantwortet nicht, warum die Warnung oder über IE8. (aber ich habe nicht downvote) – dandavis

+1

Ich downvoted, weil die ursprüngliche Antwort eine sehr schlechte, kurze Antwort war, die nicht viele Informationen zur Verfügung stellt. Der Downvote wurde jedoch entfernt, da die nachfolgenden Änderungen viel besser waren. – Evert