Книга: Выразительный JavaScript
Чиним область видимости
Чиним область видимости
Сейчас мы можем присвоить переменной значение только через define
. Эта конструкция работает как при присвоении старым переменным, так и при создании новых.
Эта неоднозначность приводит к проблемам. Если вы пытаетесь присвоить новое значение нелокальной переменной, вместо этого вы определяете локальную с таким же именем. (Некоторые языки так и делают, но мне это всегда казалось дурацким способом работы с областью видимости).
Добавьте форму set
, схожую с define
, которая присваивает переменной новое значение, обновляя переменную во внешней области видимости, если она не задана в локальной. Если переменная вообще не задана, швыряйте ReferenceError
(ещё один стандартный тип ошибки).
Техника представления областей видимости в виде простых объектов, до сего момента бывшая удобной, теперь будет вам мешать. Вам может понадобиться функция Object.getPrototypeOf
, возвращающая прототип объекта. Также помните, что область видимости не наследуется от Object.prototype
, поэтому если вам надо вызвать на них hasOwnProperty
, придётся использовать такую неуклюжую конструкцию:
Object.prototype.hasOwnProperty.call(scope, name);
Это вызывает метод hasOwnProperty
прототипа Object
и затем вызывает его на объекте scope
.
specialForms["set"] = function(args, env) {
// Ваш код
};
run("do(define(x, 4),",
" define(setx, fun(val, set(x, val))),",
" setx(50),",
" print(x))");
// ? 50
run("set(quux, true)");
// ? Ошибка вида ReferenceError
- 3.10. Область видимости переменной
- Добавление цели в рабочую область для собраний
- Добавление повестки в рабочую область для собраний
- Добавление участников в рабочую область
- 20.2.1. Атрибуты cookie: срок хранения и область видимости
- 1.4. Область применения Linux-серверов
- 11.7.7 Область для разработчиков
- Параметры и область видимости
- Глава 2 Рабочая область Microsoft Excel
- Рис. 35. Область выделения.
- A11.1. Лексическая область видимости
- 8.4. Область уведомлений