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