ПОЧТИ существует только два типа областей JavaScript:
- область действия каждого объявления var связана с наиболее непосредственно включающей функцией
- если нет функции включения для объявления var, это глобальная область действия
Таким образом, любые блоки, кроме функций, не создают новую область видимости. Это объясняет, почему циклы for перезаписывают внешние переменные области:
var i = 10, v = 10;
for (var i = 0; i < 5; i++) { var v = 5; }
console.log(i, v);
// output 5 5
Использование функций вместо:
var i = 10, v = 10;
$.each([0, 1, 2, 3, 4], function(i) { var v = 5; });
console.log(i,v);
// output 10 10
В первом примере область видимости блока отсутствовала, поэтому первоначально объявленные переменные были перезаписаны. Во втором примере из-за функции появилась новая область видимости, поэтому первоначально объявленные переменные были затенены, а не перезаписаны.
Это почти все, что вам нужно знать с точки зрения JavaScript, за исключением:
Таким образом, вы можете увидеть, что JavaScript на самом деле очень прост, хотя и не всегда интуитивно понятен Несколько вещей, о которых нужно знать:
- декларации var поднимаются в верхнюю часть области видимости. Это означает, что независимо от того, где происходит объявление var, для компилятора это так, как если бы сама переменная находилась вверху
- объединяются несколько объявлений var в одной области видимости
Итак, этот код:
var i = 1;
function abc() {
i = 2;
var i = 3;
}
console.log(i); // outputs 1
эквивалентно:
var i = 1;
function abc() {
var i; // var declaration moved to the top of the scope
i = 2;
i = 3; // the assignment stays where it is
}
console.log(i);
Это может показаться нелогичным, но это имеет смысл с точки зрения разработчика императивного языка.