为什么必须在ES2015中指定导出类型(let,var,const ...)?

And*_*ena 5 javascript commonjs node-modules ecmascript-6 ecmascript-2015

因为我读这里,ES2015可以导出var,const,let,function,classdefault.

export var myVar1 = ...;
export let myVar2 = ...;
export const MY_CONST = ...;

export function myFunc() {
    ...
}
export function* myGeneratorFunc() {
    ...
}
export class MyClass {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么.在我的外行看来,应该有named exportsdefault exports.

您输出的类型似乎并不重要.我的意思是,当你export default,你指定类型?不,你没有,它的工作原理.此外,它还能有什么区别出口varlet?它有什么区别export const?导入模块时,无论如何它都是不可变的(AFAIK).

那么,为什么必须指定导出的类型?

Ber*_*rgi 9

您不必指定导出的类型 - 您必须在模块中指定本地绑定的类型.

应该有命名导出和默认导出.

有:

export {localX as exportedX};
export {localX as default};
Run Code Online (Sandbox Code Playgroud)

你给出的所有这些例子实际上都是shorthands,它们都声明一个局部变量并以相同的名称导出它:

var myVar1 = …;
let myVar2 = …;
const MY_CONST = …;
function myFunc() {
    …
}
function* myGeneratorFunc() {
    …
}
class MyClass {
    …
}

export {
    myVar,
    myVar2,
    MY_CONST,
    myFunc,
    myGeneratorFunc,
    myClass
};
Run Code Online (Sandbox Code Playgroud)

它有什么区别export const?导入模块时,无论如何都是不可变的.

你不能你的模块中重新分配它.导出不会导出值1,它会将绑定导出到本地变量.实际上,进口不是一成不变的,它们只是不可写的.

// example.js
export var value; // this one would not work with `const`
export default function(x) {
    value = x;
}
Run Code Online (Sandbox Code Playgroud)

// main.js
import write, {value} from 'example';
console.log(value); // undefined
write(42);
console.log(value); // 42
Run Code Online (Sandbox Code Playgroud)

1:在这方面,默认出口有点特殊.该export default …声明确实让你直接导出一个表达式(或匿名函数/功能*/类的价值宣言),但幕后它实际上与名称模块中创建一个局部变量*default*.


nom*_*mve 2

声明变量、函数或新的 const 值与导出没有任何关系。var、let 或 const 在模块内的行为是不同的,因此您需要指出它是什么。导出与否是另一回事。

这些值从模块外部是不可变的,但从内部(例如从另一个导出函数)不可变。

export let mutable = 1;
export const immutable = 2;

export function change() {
    mutable = 11; //works
    immutable = 22; //throws, the value is const
}
Run Code Online (Sandbox Code Playgroud)