javascript - 访问导出变量的更改值

标签 javascript es6-modules

我有一个模块“a”,它导出一个初始化为null 的变量。该变量被导入到模块“b”中。

在对初始变量进行一些更改后,我尝试再次从模块“b”访问它,结果发现我得到了原始的 null 值。

这些变量不是作为引用导入的吗?这意味着,它们应该反射(reflect)在稍后的运行时对其所做的任何更改。

// main.js
import * as a from './a.js'
import * as b from './b.js'

// a.js
let test = null
export default test

export function change() {
  test = 'test'
  console.log(['in a.js change()', test])
}
console.log(['in a.js global', test])

// b.js
import test, { change } from './a.js'

console.log(['in b.js, pre a.change()', test])
change()
console.log(['in b.js, post a.change()', test])


/*
output:
Array [ "in a.js global", null ]
Array [ "in b.js, pre a.change()", null ]
Array [ "in a.js change()", "test" ]
Array [ "in b.js, post a.change()", null ]   WHY ISN'T THIS = "test" ?
*/

最佳答案

Aren't these variables being imported as reference? Meaning, they should reflect any changes made to them at a later point in runtime.

没有。当您导入变量时,您将其复制到一个新变量中。如果原始变量被分配了新的东西,该副本将不会改变。

当你这样做时:

import test, { change } from './a.js'

您正在将导出的默认值分配给名为 test 的新变量。该新变量与其他变量不再有任何联系。

有几种方法可以访问已更改的变量:

  1. 导出一个对象,其中变量是该对象的属性。然后,在您的原始模块中,更改该属性的值。在这种情况下,导入的模块将有一个指向同一对象的指针,因此当您访问该对象的属性时,您将看到新值。

  2. 导出方法,从模块中检索变量的当前值。

  3. 创建一个事件,外部模块可以监听该事件并在变量值发生变化时触发该事件。

请记住,普通值是通过复制值并将其插入到新变量中来分配的。另一方面,通过复制指向同一对象的指针并将该指针放入新变量来分配对象。因此,对于对象,新变量包含指向同一对象的指针。

关于javascript - 访问导出变量的更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56720857/

相关文章:

javascript - Grunt 代码覆盖不起作用

javascript - 我可以从其他 <script type ="module"> 导入 ES 模块吗?

javascript - 重新导出模块不适用于对象传播

javascript - 通配符或星号 (*) 与命名或选择性导入 es6 javascript

java - 跨域javascript函数调用?

javascript - 来自 livepipe 的模态弹出窗口

javascript - jQuery.ajax - 无需手动输入即可提交表单中的所有元素

javascript - 当在浏览器的开发工具中暂停一条语句时,如何在该语句之后立即终止执行?

javascript - 如何判断一个特定模块是 CommonJS 模块还是 ES6 模块?

javascript - 将 Highcharts(和模块)与 lit-element 一起使用