Ami*_*itK 7 javascript es6-modules
我有一个模块“a”,它导出一个作为null. 这个变量被导入到模块“b”中。
在对初始变量进行一些更改后,我尝试从模块“b”再次访问它,结果发现我获得了原始null值。
这些变量不是作为参考导入的吗?意思是,它们应该反映在运行时稍后对它们所做的任何更改。
// 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" ?
*/
Run Code Online (Sandbox Code Playgroud)
jfr*_*d00 10
这些变量不是作为参考导入的吗?意思是,它们应该反映在运行时稍后对它们所做的任何更改。
不。当您导入变量时,您将其复制到一个新变量中。如果原始变量获得分配给它的新变量,则该副本不会更改。
当你这样做时:
import test, { change } from './a.js'
Run Code Online (Sandbox Code Playgroud)
您将导出的默认值分配给名为 的新变量test。该新变量不再与其他变量有任何联系。
有几种方法可以访问已更改的变量:
导出一个对象,其中变量是该对象的一个属性。 然后,在您的原始模块中,更改该属性的值。在这种情况下,导入的模块将有一个指向同一对象的指针,因此当您访问该对象的属性时,您将看到新值。
导出从模块内检索变量当前值的方法。
创建一个外部模块可以侦听的事件,并在变量值发生变化时触发该事件。
请记住,通过复制值并将其插入新变量来分配普通值。另一方面,通过复制指向同一对象的指针并将该指针放入新变量来分配对象。因此,对于对象,新变量包含指向同一对象的指针。