Мы попытались порт следующего кода ES6:Transpiled код генерирует ошибку, когда маскирующий параметр с переменным объектом
function apitest(data) {
data.cb(true);
}
function test(cb) {
apitest({cb: function(data) {
commit(cb,data);
}});
function commit(cb,data) {
cb(data);
}
}
test(data => {
document.write(data);
});
Это может выглядеть немного странно, но это не то, что мы ожидать (вернуть true) и не вызывать ошибок.
Однако Бабель transpiles его:
"use strict";
function apitest(data) {
data.cb(true);
}
function test(_cb) {
apitest({ cb: function cb(data) {
commit(_cb, data);
} });
function commit(_cb, data) {
cb(data);
}
}
test(function (data) {
document.write(data);
});
//# sourceMappingURL=test4.js.map
Этот код не удается, так как cb()
называется внутри commit()
не имеет подчеркивание.
Независимо от того, следует ли писать такой код: является ли наш синтаксис неисправным или это ошибка в Babel?
Я понимаю, что определение cb
внутри объекта должно маскировать переданный параметр. Babel назначает разные имена переменной, используемой в объекте, и в прилагаемой функции, указывая имя анонимной функции (зачем это все равно?). После этого он должен переименовать вызов функции внутри commit()
.
Он работает с использованием этой ES6 скрипку: http://www.es6fiddle.net/ihw471ae/ – Wikunia
Похоже, проблема здесь в том, что Бабель предоставляя анонимные функции в объектных литералах с тем же именем, что и сам ключ. Отлично подходит для отладки, не подходит для вашего случая использования. Кажется, нужно думать, что вновь созданная 'функция cb' доступна из' commit() ', но это явно не так. Вы должны подать ошибку :) – CodingIntrigue
Похож на ошибку в babel, о которой вы должны сообщить. – Bergi