Использование `super` внутри функции стрелки внутри функции стрелки внутри метода

Я пытаюсь выяснить, какое поведение я вижу в Node v4.1.1 (V8 v4.5.103.33) относительноsuper и стрелка функцииуказанное поведениеи если да (или даже если нет),где это вСпецификация что он говорит, что должен (или не должен) работать в различных случаях, которые у меня есть.

Вкратце: использованиеsuper в функции стрелки (inner) внутри другой функции стрелки (outer) внутри метод работаетесли outer имеет аргументы или переменныеinner ссылки, даже еслиinner ссылки на аргументы или переменныеmethod, я хочу знатьчто говорит спецификация об этом: Должно ли оно работать постоянно, даже там, где V8 выходит из строя? Нет времени? Только в тех случаях, когда V8 позволяет работать, а не где нет?

Вот 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");

Это не с:

$ 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

Если вы удалите ссылку наx это вinner:

            let inner = () => {
                super.show(`arg = ${arg}`); // <== removed x from this
            };

Этоработает и выводы:

outer: x = 42
Parent#show: arg = arg

Чтобы доказать себе, что дело «работает» не в том, что функции были оптимизированы, я вернул их из метода и вызвал их. Вот этот немного более сложный случай (обратите внимание на комментарии); эта версияработает:

"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");

Выход:

method called with arg, flag is false
type of outer2: function
type of inner2: function
Parent2#show: A: arg (false)

Но если мы закомментируем строку с надписьюA и раскомментируйте либоB или жеC, он терпит неудачу, как MCVE.

Больше примечаний:

Я должен подчеркнуть, что вам нужно иметь функции стрелоквложенными. outer не имеет проблем с доступомsuper, Я не хочу загромождать вопрос другим большим блоком кода, но если вы добавитеsuper.show(`outer: arg = ${arg}, x = ${x}`); на вершинеouter, это работает просто отлично.

Как вы видете,inner использует как аргумент, так и переменную изmethod (ну, MCVE просто использует arg), и это нормально, но как толькоinner пытается использовать аргумент или переменную изouterвещи взрываются.

Бабель и Трейсер оба совершенно счастливы, что V8 не будет работать (Вот а такжеВот), но это может быть просто из-за того, что они делают что-то не так, как V8, или, конечно, наоборот

Это не относится к шаблонным строкам; версия до MCVE этого не использовала их (и использовала обещания, и именно так мы получили стрелки внутри стрелок).

Просто чтобы подчеркнуть, вопросчто такое указанное поведение здесь игде в спецификации указано.

Моя интуиция говорит мне, что это всего лишь ошибка V8 - это первые дни для всего этого, в конце концов, честно говоря. Но в любом случае, я просто пытаюсь выяснить, каково поведениедолжно бытьчто говорит спецификация. Я пытался следить за его различными и разными разделами, говоря оsuper и "базовые объекты" и тому подобное, и, честно говоря, я просто не понимаю.

Ответы на вопрос(1)

Ваш ответ на вопрос