Привязки импорта всегда доступны только для чтения, см. аннотацию CreateImportBinding
операция в спецификации, шаг 5:
- Создайте неизменяемую косвенную привязку в envRec для N, которая ссылается на M и N2 как его целевая привязка и запись о том, что привязка инициализирована.
(выделено мной)
Эта операция используется ModuleDeclarationInstantiation
при обработке импортные записи модуля.
So:
b++; // Does this throw an error as well?
Да, b
доступен только для чтения.
c.prop = true; // I think mutations are always allowed, right?
Если экспортируемый объект это позволяет, то да.
c = {}; // but are reassignment allowed too?
Нет, c
доступен только для чтения.
В комментарии вы сказали:
но когда живого связывания уже нет, нет смысла делать такие переменные только для чтения
Полезно помнить, что это не переменные, а привязки. Хотя переменные — это один из видов привязки, не все привязки являются переменными (даже в ES5 и более ранних версиях).
Что касается того, что они доступны только для чтения, когда это не имеет значения, помните, что задействованы два уровня привязок:
- Активная привязка export в исходном модуле.
- Активная привязка import в потребляющем модуле.
Чтобы сделать № 2 доступным для записи, когда значение из № 1 не изменится, механизм импорта должен знать это, но эта информация не находится в экспорт модуля. Экспорт просто дает имя экспортируемой привязки.
Более того, наличие изменяемых привязок импорта, а также неизменяемых привязок импорта сложнее для понимания и сложнее в реализации. (Переназначение импортированных привязок также сбивает с толку с точки зрения стиля.)
Также важно помнить, что тот факт, что они являются активными привязками, означает, что значение импорта может измениться. Предполагать:
mod1.js
:
export let foo = 41;
export function incrementFoo() {
++foo;
};
mod2.js
:
import { foo, incrementFoo } from "./mod1.js";
console.log(foo); // 41
incrementFoo();
console.log(foo); // 42 <== it changed
В этом конкретном случае это был код в mod2.js
, который вызвал изменение (путем вызова incrementFoo
), но это не обязательно. Это может быть связано с тем, что в mod1.js
произошло какое-то событие, связанное со временем, которое привело к изменению значения, или в результате вызова какого-либо другого модуля в mod1.js
и т. д.
Но поскольку foo
mod2.js
является живой привязкой к foo
mod1.js
, mod2.js
видит изменение.
person
T.J. Crowder
schedule
02.09.2016
node --harmony
- person jcubic   schedule 02.09.2016