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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage