javascript - 使用对象变量屏蔽参数时,转译代码会抛出错误

标签 javascript ecmascript-6 babeljs

我们尝试将以下代码移植到 ES6:

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)并且不会抛出错误。

但是,Babel 将其转译为:

"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

此代码失败,因为在 commit() 中调用的 cb() 没有下划线。

不管你是否应该写这种代码:是我们的语法错误还是 Babel 中的错误?

我的理解是对象内部的cb定义应该屏蔽传递的参数。 Babel 为对象中使用的变量和封闭函数中使用的变量分配了不同的名称,同时为匿名函数提供了名称(它为什么要这样做呢?)。之后,它应该重命名 commit() 中的函数调用。

最佳答案

这是 Babel 5 中的一个错误,已在 Babel 6 中修复。

关于javascript - 使用对象变量屏蔽参数时,转译代码会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34137009/

相关文章:

javascript - 在带有子文件夹的 chrome 开发工具中找不到 Grunt Babel 源映射

javascript - VSCode Linter ES6 ES7 Babel linter

javascript - 我可以在隐藏文本上写一个文本吗?如果隐藏文本通过 javascript 可见,我的文本将向右移动到隐藏文本..现在可见..?

javascript - Couchdb 列表仅返回 [object Object][object Object]

webpack - 带有死代码消除的 Webpack 树抖动是否适用于 node_modules?

javascript - 等待最后指令有用吗

javascript - 如何更改数组中项目的位置?

javascript - Angular 删除所有已完成的内容在没有刷新的情况下无法工作

javascript - 这个生成器如何返回 3?

javascript - 如何在 ES6 中创建主导入文件?