Подтвердить что ты не робот

В Javascript, когда создается новая область? (с новой функцией и в выражении "с" ). Это только две ситуации?

В Javascript, когда создается новая область? 2 ситуации, о которых я знаю, следующие:

  • с новой функцией ( update в 2012/09, я думаю, что это должен быть вызов функции, а не просто определение функции)
  • в выражении "with"

в качестве примечания, любой новый блок (в if-then-else, циклы или просто запуск блока по какой-либо другой причине) не создаст новую область.

Есть ли третья ситуация, когда новая область создается помимо двух вышеперечисленных ситуаций? Спасибо.

4b9b3361

Ответ 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