Javascript 导入使用“的函数”;导入*为x“;作为默认参数

Javascript 导入使用“的函数”;导入*为x“;作为默认参数,javascript,ecmascript-6,Javascript,Ecmascript 6,所以我在看一些javascript代码,看起来它可以工作,但实际上不行。在一个模块中,有一个函数导入一个助手包来curry/decoration(?)它自己要导出的函数字典,但将其指定为默认值,而不是直接使用导入: import * as curry from './curry-module.js' export function example(curry = curry) { return { foo: (args) => curry.foo(args), bar

所以我在看一些javascript代码,看起来它可以工作,但实际上不行。在一个模块中,有一个函数导入一个助手包来curry/decoration(?)它自己要导出的函数字典,但将其指定为默认值,而不是直接使用导入:

import * as curry from './curry-module.js'

export function example(curry = curry) {
  return {
    foo: (args) => curry.foo(args),
    bar: (args) => curry.bar(args),
  }
}
这里的动机似乎是允许您在模拟或测试时为它提供不同的curry包,或者让它默认使用真正的curry函数

但是,如果我将此函数导入另一个模块并在没有参数的情况下调用它,则不会使用默认值,并且会出现未定义的错误:

import { example } from './example-module.js'

// within example(), curry is undefined and throws an error
example().foo(someArgs) 

这里怎么了?

在我的特殊情况下,问题是导入变量和参数变量的名称相同。这给transpiler带来了歧义,我最终得到了如下ES5代码:

var curry = require('./curry-module.js')

function example() {
    var curry = arguments.length > 0 && arguments[0] !== undefined 
      ? arguments[0] 
      : curry;
}
因此,
curry
被重新声明,使其未定义,然后在未传入任何参数时分配给自身。而且外部范围中的
curry
从未使用过


将函数的参数名称更改为不同于导入名称是此处的修复方法。

这不是transpiler的问题,如果没有transpiler,它也会被破坏。如果你做了
var foo=foo,这是一样的。我想你不明白我在说什么。这实际上是transpiler的一个问题,以及它在从ES6移动到ES5时选择变量名和声明互操作变量的方式。两种咖喱都是不同的,transpiler可以识别这一点,但互操作分配会创建冗余分配。它不会出现在带有transpiler的压缩包中,也会丑化变量名。是和否。请参阅重复问题。如果在浏览器控制台中运行此代码:
var foo=42;功能条(foo=foo){console.log(foo);};bar()你会发现它也不起作用(虽然你没有默默地失败,而是得到了一个错误)。这里我不是在谈论ES5行为,而是一个有效的ES6构造,它会导致ES5传输文件/互操作步骤出现问题。它不是有效的(如在runnable中)ES6,这是我的全部观点。见重复问题。