2014-10-24 2 views
16

In another question, hatte jemand eine falsche Klassendefinition, den Code enthielt wie:Warum ist funkname() = wert; gültige Syntax?

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

Der offensichtliche Fehler ist, dass das Verfahren sollte ohne die Klammern nach name mit this.name = ..., definiert werden. Wenn Sie den Konstruktor aufrufen, erhalten Sie einen Fehler, da this.name nicht definiert ist. Ich habe ein einfacheres Beispiel in der Konsole:

foo() = 3;  // Causes: ReferenceError: foo is not defined 
function foo() {}; 
foo() = 3;  // Causes: ReferenceError: Invalid left-hand side in assignment 

Gibt es einen Kontext, in dem eine Funktion etwas zurückgeben konnte, die zugeordnet werden kann? Ich glaube nicht, dass Javascript Referenzen wie C++ oder PHP hat, denen man zuordnen kann. Warum führt dies nicht zu einem Syntaxfehler und nicht zu unterschiedlichen Fehlern, je nachdem, ob die Funktion definiert ist oder nicht?

+0

Wie die Grammatik definiert ist, ist kein Syntaxfehler. Ich kenne keine Möglichkeit, die Syntax zu verwenden, um etwas semantisch Gültiges zu konstruieren. –

+0

Meine Verwirrung über diese Frage stammt aus dem Titel: "Warum ist funkname() = value; gültige Syntax?" Es gibt keine Situation, wo das eine gültige Syntax ist. Es wird * immer * ein Fehler ausgelöst. – ncksllvn

+0

Außerdem ersetzt "ReferenceError" natürlich 'SyntaxError' - im Beispielcode versucht der Interpreter als Erstes, eine undefinierte Funktion auszuführen. – ncksllvn

Antwort

15

vom ECMA Script 5.1 Specification for References unter Angabe

beispielsweise der linke Operand einer Zuweisung wird erwartet, dass eine Referenz zu erzeugen. Das Verhalten der Zuweisung könnte stattdessen vollständig in Form einer Fallanalyse der syntaktischen Form des linken Operanden eines Zuweisungsoperators erklärt werden, aber für eine Schwierigkeit: Funktionsaufrufe können Referenzen zurückgeben. Diese Möglichkeit ist nur für Host-Objekte zugelassen. Keine integrierte ECMAScript-Funktion, die durch diese Spezifikation definiert wird, gibt eine Referenz zurück und es gibt keine Vorkehrung für eine benutzerdefinierte Funktion, um eine Referenz zurückzugeben. (Ein weiterer Grund, nicht eine syntaktische Fallanalyse zu verwenden, ist, dass es langwierig und umständlich wäre, viele Teile der Spezifikation zu beeinflussen.)


Gibt es einen Kontext, in dem eine Funktion etwas zurückgeben kann, dass kann zugeordnet werden?

Also, nein. Keine benutzerdefinierte Funktion könnte einen Verweis zurückgeben, dem wir einen Wert zuweisen können.

Warum verursacht dies nicht einen Syntaxfehler und nicht verschiedene Fehler, je nachdem, ob die Funktion definiert ist oder nicht?

Wie in der Beschreibung erwähnt, würde die syntaktische Analyse langwierig, umständlich und beeinflussen viele Teile der Spezifikation sein. Daher wird die Syntaxprüfung nicht durchgeführt.

+6

Also haben sie es getan, um die Spezifikation zu vereinfachen, und möglicherweise einige herstellerspezifische Funktionen zu ermöglichen? Ich kann das akzeptieren. – Barmar