为什么重新分配导入的对象抛出ReferenceError?

问题描述 投票:2回答:2
// 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相同的文件中定义,则可以工作。这是预期的行为还是我错过了什么?

codesandbox.io https://codesandbox.io/s/nrn9o71jmm的链接

请检查浏览器控制台而不是内置的codesandbox控制台以查看错误。

javascript import es6-modules referenceerror
2个回答
1
投票

为什么我不能在myAsyncFunction中重新分配dataObj,即使它是在不同文件中使用let定义的

答案是在您收到的其他错误消息中:

“dataObj”是只读的

所有导入都是只读的。它们如何定义并不重要。 ReferenceError可能是由于代码如何转换。

但是如果我调用与changeDataObj在同一文件中定义的dataObj,则可以正常工作

因为dataObj是该文件中正常的let绑定。


0
投票

如果你只是想要一个名为dataObj的局部变量(这可能不是一个好的选择,但我会这么认为),那么你需要的是你的陈述的let

let dataObj = Object.assign({}, response);

然后忽略全局dataObj并获得一个新变量。不过,我认为这可能会令人困惑。

正如Felix所解释的那样,所有导入都标记为只读,因此无法分配新值。这实际上是一个很棒的功能。

© www.soinside.com 2019 - 2024. All rights reserved.