// 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在同一文件中定义的)也可以工作。是预期的行为还是我缺少了什么?

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

请检查浏览器控制台,而不是内置的代码和框控制台,以查看错误。

最佳答案

为什么我不能在myAsyncFunction中重新分配dataObj,即使在其他文件中用let定义了它也是如此


答案在您收到的另一条错误消息中:


  “ dataObj”是只读的


所有导入均为只读。它们的定义无关紧要。 ReferenceError可能是由于代码的转换方式所致。


  但如果我调用与changeDataObj在同一文件中定义的dataObj,则可以使用


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

09-25 18:41