В JavaScript, когда новый объем создается? (с новой функцией и в “с” оператором), это эти только 2 ситуации?

В JavaScript, когда новый объем создается? Эти 2 ситуации, о которых я знаю:

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

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

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

18
задан nopole 11 September 2012 в 19:28
поделиться

3 ответа

Да, есть третий случай, когда цепочка областей видимости расширяется (помимо let расширения mozilla, которое упоминается Shog9 ), когда блок catch оценивается:

Производственный блок Catch: catch (Идентификатор) оценивается как следующим образом:

  1. Пусть C будет параметром, который был передан этому продукту.

  2. Создайте новый объект как будто с помощью выражения new Object ().

  3. Создать свойство в объекте Результат (2). Имя свойства: Идентификатор, значениеisC. value, а атрибуты - {DontDelete}.

  4. Добавьте Результат (2) в начало цепочки областей видимости .

  5. Оценить блок.

  6. Удалить Результат (2) из ​​передней части цепочки областей видимости .

  7. Вернуть результат (5).

Таким образом, в основном создается новый объект со свойством с именем типа «Идентификатор», переданным в catch , этот новый объект добавляется в цепочку областей видимости, поэтому мы можем использовать этот идентификатор в блок catch .

try {
  throw "error";
} catch (identifier) {
  // `identifier` accessible here..
}

Но имейте в виду, что он только временно увеличивает текущую область видимости, чтобы ввести идентификатор catch , любая переменная, объявленная внутри, будет просто поднята в верхняя часть закрывающей функции.

9
ответ дан 30 November 2019 в 09:27
поделиться

Также есть оператор let . Имейте в виду, что let (...) {} , как и с (...) {} , не создает новую область для переменных, введенных в ] блок. Однако let definitions могут создавать переменные, привязанные к блоку (любому блоку), в котором они определены.

Справедливое предупреждение: как было указано в комментариях, в то время как let является частью JavaScript 1.7 (диалект Mozilla ECMA-262 / ECMAScript), это не ] часть ECMAScript и, скорее всего, в ближайшее время не будет работать в других браузерах, кроме Firefox. Также обратите внимание, что хотя с могут использоваться в качестве замены для операторов let в текущих реализациях ECMAScript, «строгий» режим, предложенный для ожидающего рассмотрения 5-го издания ECMA-262, также запрещает это. Если вы беспокоитесь о написании кроссплатформенного, ориентированного на будущее кода (, а вы должны быть ... ), тогда придерживайтесь функций для управления областью видимости !

6
ответ дан 30 November 2019 в 09:27
поделиться

это также будет относиться к объекту, в котором вы находитесь:

a = {
   f: function(){ ... },
   b: function(){this.f()}
}
a.b() //calls a.f
-3
ответ дан 30 November 2019 в 09:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: