为什么重新分配导入的对象会抛出 ReferenceError?
Why is re-assigning imported objects throw ReferenceError?
// fileA.js
export let dataObj = {name: "intitial name"};
export let changeDataObj = () => {
dataObj = Object.assign({}, {
name: "changed in changeDataObj fn"
});
}
//fileB.js
import {dataObj, changeDataObj} from "./fileA.js";
const myAsyncFunction = async () => {
const response = await myApiCall();
console.log(dataObj); // {name: "initial name"}
console.log(response); // {name: "name from api"}
dataObj = Object.assign({}, response);
// Throws ReferenceError: dataObj not defined on my computer with Webpack, babel
// throws Error: "dataObj" is read-only. in codesandbox.io vanilla template using parcel. Codesandbox link https://codesandbox.io/s/nrn9o71jmm
// but,
changeDataObj();
console.log(dataObj); // {name: "changed in changeDataObj fn"}
}
为什么我不能在 myAsyncFunction
中重新分配 dataObj,即使它是在不同的文件中用 let
定义的,但是如果我调用在同一文件中定义的 changeDataObj
就可以工作作为 dataObj
。这是预期的行为还是我遗漏了什么?
link为codesandbox.iohttps://codesandbox.io/s/nrn9o71jmm
请检查浏览器控制台而不是内置的 codesandbox 控制台以查看错误。
Why can't I re assign dataObj inside myAsyncFunction
even though it is defined with let in different file
答案在您收到的另一条错误消息中:
"dataObj" is read-only
所有导入都是只读的。它们是如何定义的并不重要。 ReferenceError
可能是由于代码的转换方式所致。
but works if I call changeDataObj
which is defined in the same file as dataObj
因为 dataObj
是该文件中的正常 let
绑定。
如果你只是想有一个名为 dataObj
的局部变量(这可能不是一个好的选择,但我会这样认为),那么你需要的是一个 let
声明:
let dataObj = Object.assign({}, response);
然后全局 dataObj
被忽略,你得到一个新变量。不过,我认为这可能真的很令人困惑。
正如 Felix 所解释的,所有导入都被标记为只读,因此无法分配新值。这实际上是一个很棒的功能。
// fileA.js
export let dataObj = {name: "intitial name"};
export let changeDataObj = () => {
dataObj = Object.assign({}, {
name: "changed in changeDataObj fn"
});
}
//fileB.js
import {dataObj, changeDataObj} from "./fileA.js";
const myAsyncFunction = async () => {
const response = await myApiCall();
console.log(dataObj); // {name: "initial name"}
console.log(response); // {name: "name from api"}
dataObj = Object.assign({}, response);
// Throws ReferenceError: dataObj not defined on my computer with Webpack, babel
// throws Error: "dataObj" is read-only. in codesandbox.io vanilla template using parcel. Codesandbox link https://codesandbox.io/s/nrn9o71jmm
// but,
changeDataObj();
console.log(dataObj); // {name: "changed in changeDataObj fn"}
}
为什么我不能在 myAsyncFunction
中重新分配 dataObj,即使它是在不同的文件中用 let
定义的,但是如果我调用在同一文件中定义的 changeDataObj
就可以工作作为 dataObj
。这是预期的行为还是我遗漏了什么?
link为codesandbox.iohttps://codesandbox.io/s/nrn9o71jmm
请检查浏览器控制台而不是内置的 codesandbox 控制台以查看错误。
Why can't I re assign dataObj inside
myAsyncFunction
even though it is defined with let in different file
答案在您收到的另一条错误消息中:
"dataObj" is read-only
所有导入都是只读的。它们是如何定义的并不重要。 ReferenceError
可能是由于代码的转换方式所致。
but works if I call
changeDataObj
which is defined in the same file asdataObj
因为 dataObj
是该文件中的正常 let
绑定。
如果你只是想有一个名为 dataObj
的局部变量(这可能不是一个好的选择,但我会这样认为),那么你需要的是一个 let
声明:
let dataObj = Object.assign({}, response);
然后全局 dataObj
被忽略,你得到一个新变量。不过,我认为这可能真的很令人困惑。
正如 Felix 所解释的,所有导入都被标记为只读,因此无法分配新值。这实际上是一个很棒的功能。