В JavaScript, когда новый объем создается? Эти 2 ситуации, о которых я знаю:
как примечание, любой новый блок (в if-then-else, циклах, или только начало блоке ни по какой другой причине) не создаст новый объем.
Существует ли третья ситуация, где новый объем создается помимо этих двух ситуаций выше?Спасибо.
Да, есть третий случай, когда цепочка областей видимости расширяется (помимо let
расширения mozilla, которое упоминается Shog9 ), когда блок catch
оценивается:
Производственный блок Catch: catch (Идентификатор) оценивается как следующим образом:
Пусть C будет параметром, который был передан этому продукту.
Создайте новый объект как будто с помощью выражения new Object ().
Создать свойство в объекте Результат (2). Имя свойства: Идентификатор, значениеisC. value, а атрибуты - {DontDelete}.
Добавьте Результат (2) в начало цепочки областей видимости .
Оценить блок.
Удалить Результат (2) из передней части цепочки областей видимости .
Вернуть результат (5).
Таким образом, в основном создается новый объект со свойством с именем типа «Идентификатор», переданным в catch
, этот новый объект добавляется в цепочку областей видимости, поэтому мы можем использовать этот идентификатор в блок catch
.
try {
throw "error";
} catch (identifier) {
// `identifier` accessible here..
}
Но имейте в виду, что он только временно увеличивает текущую область видимости, чтобы ввести идентификатор catch
, любая переменная, объявленная внутри, будет просто поднята в верхняя часть закрывающей функции.
Также есть оператор let . Имейте в виду, что let (...) {}
, как и с (...) {}
, не создает новую область для переменных, введенных в ] блок. Однако let definitions могут создавать переменные, привязанные к блоку (любому блоку), в котором они определены.
Справедливое предупреждение: как было указано в комментариях, в то время как let
является частью JavaScript 1.7 (диалект Mozilla ECMA-262 / ECMAScript), это не ] часть ECMAScript и, скорее всего, в ближайшее время не будет работать в других браузерах, кроме Firefox. Также обратите внимание, что хотя с
могут использоваться в качестве замены для операторов let в текущих реализациях ECMAScript, «строгий» режим, предложенный для ожидающего рассмотрения 5-го издания ECMA-262, также запрещает это. Если вы беспокоитесь о написании кроссплатформенного, ориентированного на будущее кода (, а вы должны быть ... ), тогда придерживайтесь функций для управления областью видимости !
это также будет относиться к объекту, в котором вы находитесь:
a = {
f: function(){ ... },
b: function(){this.f()}
}
a.b() //calls a.f