2012-10-29 9 views
18

Lesen Sie die EcmaScript specification, section 8.7 The Reference Specification Type:Echte Beispiele für Ecmascript-Funktionen, die eine Referenz zurückgeben?

Der Reference-Typ verwendet wird, um das Verhalten solcher Operatoren wie delete, typeof, und die Zuweisungsoperatoren zu erklären. [...] Eine Referenz ist eine aufgelöste Namensbindung.

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.

Die letzten beiden Sätze haben mich beeindruckt. Mit diesem können Sie Dinge wie coolHostFn() = value (valid syntax, BTW) tun. Meine Frage ist also:

Gibt es EcmaScript-Implementierungen, die Host-Funktionsobjekte definieren, die Reference Werte ergeben?

+2

Verwandte? http://stackoverflow.com/questions/3709866/whats-a-valid-left-hand-side-expression-in-javascript-grammar – bfavaretto

+0

Ja, ich denke schon. Diese Frage beweist, dass die Syntax, die ich oben verwendet habe, gültig wäre :-) – Bergi

+0

Ich google nur "" gibt eine Referenz "Javascript" zurück und schaute die ersten Seiten durch, aber da war nichts. –

Antwort

6

Google Chrome-Engine funktioniert sehr auf diese Weise. Allerdings werden Sie in der Konsole werden Sie feststellen, ein ReferenceError: Invalid left-hand side in assignment erhalten, wenn die folgende Ausführung:

var myObj = new Object(); 
function myFunc() { 
    myObj.test = "blah"; 
    return myObj; 
} 
myFunc() = new String("foobar"); 

Dies ist ein früher Fehler, aber, und weil die Umsetzung ECMAScript des v8, sollte dies funktionieren, wenn es richtig myFunc ausführt bevor der Referenzfehler angenommen wird.

Also, in der aktuellen Implementierung von V8? Ja und Nein. Es ist standardmäßig implementiert (aufgrund der Struktur der Sprache), die Fähigkeit wird jedoch durch ein anderes Problem gestoppt. coolHostFn() = value sollte keinen Fehler zurückgeben und sollte tatsächlich in der Lage sein, richtig auszuführen. Allerdings sollte 3=4 höchstwahrscheinlich einen Zuordnungsfehler auf der linken Seite zurückgeben.

Nicht genau eine Antwort auf Ihre Frage, aber ich hoffe, es hilft zu klären, warum es nicht funktioniert.

(Hier ist die Ausgabe/Ticket falls jemand will läuten ... http://code.google.com/p/v8/issues/detail?id=838)

+1

Danke, interessant, dass Chrome solche Funktionen überhaupt nicht unterstützt. Aber es beantwortet wirklich nicht die Frage "Gibt es solche Funktionen?" (Da Sie ein 'myFunc' nicht codieren können, muss es ein Host-Objekt sein) – Bergi

+0

In der Tat. Ich habe nicht die Gelegenheit, einen Kommentar abzugeben, also dachte ich, ich würde versuchen, die Antwort zu vereiteln. Die Antwort auf "Gibt es solche Funktionen?" ist ja. Die Nicht-Unterstützung durch Chrome ist eigentlich eher ein Bug als ein Feature, das von einer bestimmten Implementierung nicht unterstützt wird. Und ja, das Beispiel war ein bisschen skizzenhaft. Wirf es einfach zusammen, um es so gut wie möglich zu erklären. :) – Swivel

Verwandte Themen