2014-12-05 13 views
11

diese Schnipsel lief, ohne irgendwelche sich beschweren auf beiden NodeJS und dem Browser:ist Javascript 'Rückkehr' wirklich ein * Keyword *?

this.return = function (x) { 
    return x 
}; 

console.log (this.return(1)); 

ich es erwartet hatte hart mit einem Syntaxfehler fehlschlagen.

Ich meinte, ich kann verstehen, warum this['return'] funktioniert .. aber ich immer return war ein lexer Schlüsselwort?

ist Javascript eine kontextsensitive Sprache?

hinzugefügt: Der Punkt ist, dass der Lexer kein T_RETURN-Token hat, aber stattdessen einige T_STRING verwendet. Ist das nicht?

+0

Sie können zu undefinierten überschrieben. Bedeutet nicht, dass es eine gute Idee ist! Edit: technisch überschreiben Sie die Rückgabe nicht. –

+0

Ich weiß nichts über Interpreter, aber für mich ist es nur "sinnvoll", dass nach einem solchen '.' alles, was als Identifier geparst werden kann, gültig ist. –

+0

Es ist ein reserviertes Schlüsselwort, aber diese können als Eigenschaften verwendet werden, ohne dass ein Fehler auftaucht, es ist nur eine sehr schlechte Idee, dies zu tun. – adeneo

Antwort

1

Ja, Rückgabe ist ein Schlüsselwort. Sie haben eine Eigenschaft definiert und im Wesentlichen eine Zeichenfolge mit dem Namen return verwendet. Haben Sie Rückkehr tatsächlich benutzen es würde einen Fehler verursacht hat

var return = "error";//Uncaught SyntaxError: Unexpected token return

+0

Du nimmst etwa "define", was wirklich wirklich später im Prozess passiert. Lexer -> Scanner -> Parser. Ich hatte erwartet, dass es einen Fehler auf Scanner-Ebene auslösen würde. – eridal

10

return ist ein reserved keyword, aber reservierte Schlüsselwörter können als property accessors ohne Problem verwendet werden, es ist nur allgemein schlechte Praxis, dies zu tun.

Reservierte Schlüsselwörter können speziell nicht als Namen für Variablen, Funktionen, Methoden verwendet werden, oder Kennungen für Arrays und Objekte, da ECMAScript gibt ein spezielles Verhalten für sie:

Der Quelltext von ECMAScript-Skripten gescannt wird von links nach rechts und wird in eine Sequenz von Eingabeelementen umgewandelt, die Token, Steuerzeichen, Zeilenabschlüsse, Kommentare oder Leerzeichen sind.

ECMAScript definiert auch bestimmte Schlüsselwörter und Literale und hat Regeln für das automatische Einfügen von Semikola in Endanweisungen.

Reservierte Wörter gelten eigentlich nur für Identifikatoren (vs. IdentifierNames).
Wie in ES5 beschrieben, sind dies alle IdentifierNames, die ReservedWords nicht ausschließen.

a.return 
a["return"] 
a = { return: "test" }. 

Diese sind jedoch nicht

function return() {} 
var return; 

More on MDN

+0

Ich bin schon einmal auf etwas Ähnliches gestoßen. Obwohl es technisch möglich ist, wird die Verwendung von reservierten Schlüsselwörtern als schlechte Idee betrachtet, da der Code später schwer zu lesen und zu verstehen ist. – FlyingPiMonster

+2

@ kittycat3141: Ich würde sagen, es ist eine schlechte Übung, weil a) Leute nicht daran gewöhnt sein können (was vielleicht das ist, worauf Sie sich beziehen) und b) der Code nicht in älteren Versionen von IE8 läuft. A) wird sich hoffentlich ändern, sobald ES6 veröffentlicht wird (was "Map # delete" definiert). –

+0

@FelixKling - und es ist leicht, verwirrt zu werden, in einer Minute machst du 'foo [" return "]', in der nächsten machst du 'foo [return]' und kannst nicht verstehen, warum es nicht funktioniert. Auch einige Minification-Software und/oder IDEs können Probleme haben, wenn plötzlich 'Rückkehr' angezeigt wird, wo es nicht hingehört, besonders wenn Sie Dinge wie' foo.return' tun. – adeneo