Mit `super` innerhalb einer Pfeilfunktion innerhalb einer Pfeilfunktion innerhalb einer Methode
Ich versuche herauszufinden, ob in Node v4.1.1 (V8 v4.5.103.33) ein Verhalten in Bezug auf @ vorliegsuper
und Pfeilfunktionen sindspezifiziertes Verhalten, und wenn ja (oder tatsächlich, wenn nicht),wo ist e in demSpezifikatio dass es sagt, dass es in den verschiedenen Fällen, die ich habe, funktionieren soll (oder nicht).
In Kürze: Verwenden vonsuper
in einer Pfeilfunktion inner
) innerhalb einer anderen Pfeilfunktion outer
) innerhalb einer Methode funktioniertes sei den outer
hat Argumente oder Variableninner
Referenzen, auch wenninner
referenziert Argumente oder Variablen vonmethod
. Ich möchte wissenwas die Spezifikation sagt dazu: Sollte es die ganze Zeit funktionieren, auch wenn V8 ausfällt? In keiner dieser Zeiten? Nur in den speziellen Fällen, in denen V8 derzeit funktioniert und nicht dort, wo es nicht funktioniert?
Hier ist ein MCVE:
"use strict";
class Parent {
show(msg) {
console.log(`Parent#show: ${msg}`);
}
}
class Child extends Parent {
method(arg) {
let outer = (x) => {
console.log(`outer: x = ${x}`);
let inner = () => {
super.show(`arg = ${arg}, x = ${x}`);
};
inner();
};
outer(42);
}
}
new Child().method("arg");
Das schlägt fehl mit:
$ node test.js /path/test.js:13 super.show(`arg = ${arg}, x = ${x}`); ^^^^^ SyntaxError: 'super' keyword unexpected here at outer (/path/test.js:16:13) at Child.method (/path/test.js:18:9) at Object. (/path/test.js:22:13) at Module._compile (module.js:434:26) at Object.Module._extensions..js (module.js:452:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:475:10) at startup (node.js:117:18) at node.js:951:3
Wenn Sie den Verweis auf @ entfernx
das ist ininner
:
let inner = () => {
super.show(`arg = ${arg}`); // <== removed x from this
};
it works und Ausgänge:
outer: x = 42 Parent#show: arg = arg
Um mir selbst zu beweisen, dass der "Works" -Fall nicht darin bestand, dass die Funktionen wegoptimiert wurden, habe ich sie aus der Methode zurückgegeben und sie aufgerufen. Hier ist der etwas komplexere Fall (beachten Sie die Kommentare); diese Version works:
"use strict";
class Parent2 {
show(msg) {
console.log(`Parent2#show: ${msg}`);
}
}
class Child2 extends Parent2 {
method(arg) {
let flag = Math.random() < 0.5;
console.log(`method called with ${arg}, flag is ${flag}`);
let x = "A"; // **A**
let outer2 = (/*x*/) => { // **B**
//let x = "C"; // **C**
let inner2 = () => {
super.show(`${x}: ${arg} (${flag})`);
};
return inner2;
};
return outer2;
}
}
let o = new Child2().method("arg");
console.log(`type of outer2: ${typeof o}`);
let i = o();
console.log(`type of inner2: ${typeof i}`);
i("B");
Ausgabe
method called with arg, flag is false type of outer2: function type of inner2: function Parent2#show: A: arg (false)
Aber wenn wir die mit @ gekennzeichnete Zeile auskommentierA
und Kommentar entwederB
oderC
, es schlägt fehl wie das MCVE.
Weitere Hinweise:
Ich sollte betonen, dass Sie die Pfeilfunktionen haben müssen verschachtelt. outer
hat keine Probleme mit dem Zugriff aufsuper
. Ich möchte die Frage nicht mit einem anderen großen Codeblock überladen, aber wenn Sie @ hinzufügsuper.show(`outer: arg = ${arg}, x = ${x}`);
obenouter
, es funktioniert gut.
Wie du sehen kannst,inner
verwendet sowohl ein Argument als auch eine Variable vonmethod
(na ja, der MCVE verwendet nur ein Argument), und das ist in Ordnung, aber sobaldinner
versucht ein Argument oder eine Variable von @ zu verwendouter
, Dinge explodieren.
Babel und Traceur sind beide sehr froh, den Fall zu transpilieren, dass V8 nicht läuft Hie undHie), aber das könnte nur sein, dass sie etwas falsch machen, was V8 richtig macht (oder natürlich umgekehrt).
Es bezieht sich nicht auf Vorlagenzeichenfolgen. In der Vorversion von MCVE wurden sie nicht verwendet (und es wurden Versprechungen verwendet, so dass wir Pfeile innerhalb von Pfeilen erhalten haben).
Nur um zu betonen, ist die Frage was ist das angegebene Verhalten hier und wo in der Spezifikation ist es angegeben.
Mein Gut sagt mir, dass dies nur ein V8-Fehler ist - es sind noch frühe Tage für dieses Zeug, schließlich, fair 'nuff. Aber so oder so, ich versuche nur herauszufinden, wie sich das verhältsollte sei, was die Spezifikation sagt. Ich habe versucht, den verschiedenen Abschnitten zu folgen, in denen von @ gesprochen wirsuper
und "Basisobjekte" und so, und ehrlich gesagt, ich verstehe es einfach nicht.