ES6 模块:在返回变量之前必须显式定义变量吗?

mik*_*ski 1 javascript es6-modules

在提供 JavaScript 文件之前type="module",我可以在用于返回变量的同一语句中定义变量。

例子:

function formatNameForFile(name) {
    return formattedName = name.toLowerCase().replace(/ /g, '-');
}
Run Code Online (Sandbox Code Playgroud)

但是,当我添加type="module"到 JavaScript 文件后,我收到了以下引用错误:

Uncaught ReferenceError: formattedName is not defined
Run Code Online (Sandbox Code Playgroud)

我可以通过在返回变量之前显式定义变量来消除这些错误,如下所示:

function formatNameForFile(name) {
    const formattedName = name.toLowerCase().replace(/ /g, '-');
    return formattedName;
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?只要这些变量在其中绑定(使用constvar或),是否仍然可以通过初始 return 语句访问这些​​变量?let

Cer*_*nce 5

ES6 模块始终是严格的

JavaScript 模块的全部内容自动处于严格模式,无需任何语句来启动它。

在严格模式下,当您尝试分配给尚未定义的变量时,会引发错误:

'use strict';
something = 'foo';
Run Code Online (Sandbox Code Playgroud)

这就是您的模块中发生的情况。由于变量名尚未在函数内或其任何父作用域中的任何位置定义,因此会引发错误。

只要这些变量在其中绑定(使用 const、var 或 let),是否仍然可以通过初始 return 语句访问这些​​变量?

当然可以,但是您不能引用或分配尚未初始化的变量。

但无需创建要立即返回的变量。如果你愿意,你可以做

const formatNameForFile = name => name.toLowerCase().replace(/ /g, '-');
Run Code Online (Sandbox Code Playgroud)