如果在导入的模块中使用但在它们之外声明,是否存在命名空间冲突的风险?

Jaa*_*rhu 5 javascript

如果我有三个文件,基本上是这样的:

file_one.js:

const lol = () => {
    console.log('Laughing out loud in file_one')
}

const funcOne = () => {
    lol()
}

export default funcOne
Run Code Online (Sandbox Code Playgroud)

file_two.js:

const lol = () => {
    console.log('Laughing out loud in file_two')
}

const funcTwo = () => {
    lol()
}

export default funcTwo
Run Code Online (Sandbox Code Playgroud)

one_and_two_importer.js:

import funcOne from 'file_one'
import funcTwo from 'file_two'


funcOne()
funcTwo()
Run Code Online (Sandbox Code Playgroud)

我的假设是函数 lol 将在全局范围内,从而导致命名空间冲突,但显然这不会发生。此外,如果我尝试在 one_and_two_importer.js 中记录函数 lol,我会收到未定义的错误。

正如文档所说,导入将模块插入到当前范围,但导入模块使用的常量在哪个范围内?

Aro*_*ron 2

这两个lol函数现在是闭包,这意味着尽管它们仍然在每个funcOnefuncTwo函数内部被调用,但它们是隐藏的,因为它们不可公开访问。

对于 ES6 模块(或 commonJS),注入本地名称空间的唯一名称是您显式导入的名称,例如在所有情况下

import x from 'y'
import { x } from 'y'
import * as x from 'y'
Run Code Online (Sandbox Code Playgroud)

命名空间只会获取 的附加变量x。没有其他变量以隐藏方式注入。

发生冲突的唯一方法是在两个文件中显式导出lol变量,然后尝试按名称导入它。例如两个文件中都有

export lol
Run Code Online (Sandbox Code Playgroud)

进而

import { lol } from 'file_one'
import { lol } from 'file_two'
Run Code Online (Sandbox Code Playgroud)

除非您尝试执行类似的操作,否则这两个lol变量的作用域将仅限于各自的模块,因此不会相互冲突。

我建议阅读更多有关JavaScript 中闭包如何工作的内容。