В Javascript, когда создается новая область? (с новой функцией и в операторе «с») Это только две ситуации? - PullRequest
18 голосов
/ 28 апреля 2010

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 28 апреля 2010

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

Улов производства: улов (Идентификатор) Блок оценивается как следующим образом:

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

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

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

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

  5. Оценка блока.

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

  7. Результат возврата (5).

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

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

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

6 голосов
/ 28 апреля 2010

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

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

0 голосов
/ 28 апреля 2010

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

a = {
   f: function(){ ... },
   b: function(){this.f()}
}
a.b() //calls a.f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...