javascript - 为什么重新分配导入的对象会抛出 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"}
}
为什么我不能在里面重新分配 dataObj,myAsyncFunction
即使它是let
在不同的文件中定义的,但是如果我调用changeDataObj
它在同一个文件中定义的dataObj
. 这是预期的行为还是我错过了什么?
codesandbox.io 的链接https://codesandbox.io/s/nrn9o71jmm
请检查浏览器控制台而不是内置的代码和框控制台以查看错误。
解决方案
为什么我不能在里面重新分配 dataObj
myAsyncFunction
即使它是用 let 在不同的文件中定义的
答案在您收到的另一条错误消息中:
“dataObj”是只读的
所有导入都是只读的。如何定义它们并不重要。这ReferenceError
可能是由于代码的转换方式。
但如果我调用
changeDataObj
在同一个文件中定义的dataObj
因为dataObj
是该文件中的普通let
绑定。
推荐阅读
- node.js - 无法在 mac 终端上安装 npm /react /node js
- javascript - 点击一个简单的按钮时页面刷新?
- javascript - 如何在使用 jquery 的数据表中查看复选框是否已切换并据此执行操作?
- sql - 有没有办法在 ado .net 中使用完全限定的 sql 列名?
- go - KrakenD 插件读取配置设置
- android - Comletable.create 的 RxJava Completable 行为{}
- javascript - 如何提取视频文件大小 HTML5
- javascript - 在 JavaScript 中获取 MS Edge 中的 Microsoft 帐户名称
- javascript - 如何在JS中循环包含对象和对象数组的数组
- php - NEO4J 的 PHP 驱动程序