Почему при переназначении импортированных объектов выбрасывается ReferenceError? - PullRequest
2 голосов
/ 24 марта 2019
// 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. Это ожидаемое поведение или я что-то упустил?

Ссылка на кодыandbox.io https://codesandbox.io/s/nrn9o71jmm

Пожалуйста, проверьте консоль браузера вместо встроенных кодов и консоли коробки, чтобы увидеть ошибки.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Почему я не могу повторно назначить dataObj внутри myAsyncFunction, даже если он определен с помощью let в другом файле

Ответ содержится в другом сообщении об ошибке, которое вы получаете:

«dataObj» только для чтения

Весь импорт только для чтения. Неважно, как они определены. ReferenceError скорее всего из-за того, как код преобразуется.

, но работает, если я позвоню changeDataObj, который определен в том же файле, что и dataObj

Поскольку dataObj является обычной let привязкой в ​​этом файле.

0 голосов
/ 24 марта 2019

Если вы просто хотели иметь локальную переменную с именем dataObj (которая, возможно, не является хорошим выбором, но я предполагаю, что это так), то вам нужно let для вашего утверждения:

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

Тогда глобальный dataObj игнорируется, и вы получаете новую переменную.Однако я думаю, что это может сбить с толку.

Как объясняет Феликс, все операции импорта помечены как доступные только для чтения, и поэтому им не может быть присвоено новое значение.На самом деле это отличная функция.

...