В Javascript я иногда слишком погружен в идею о том, что функция создает новую область, и иногда я даже думаю, что следующая анонимная функция создаст новую область, когда она определена и назначена для onclick:
<a href="#" id="link1">ha link 1</a>
<a href="#" id="link2">ha link 2</a>
<a href="#" id="link3">ha link 3</a>
<a href="#" id="link4">ha link 4</a>
<a href="#" id="link5">ha link 5</a>
<script type="text/javascript">
for (i = 1; i <= 5; i++) {
document.getElementById('link' + i).onclick = function() { var x = i; alert(x); return false; }
}
</script>
но на самом деле анонимная функция создаст новую область видимости, верно, но ТОЛЬКО когда она вызывается, так ли это? Таким образом, x
внутри анонимной функции не создается, новая область не создается. Когда функция была позже вызвана, новая область в порядке, но i
находится во внешней области, и x
получает свое значение, и в любом случае это все 6.
Следующий код фактически вызовет функцию и создаст новую область видимости, и поэтому x
- это новая локальная переменная x
в новой области видимости каждый раз, а также вызов функции при нажатии на ссылку on будет использовать разные x
в разных областях.
<a href="#" id="link1">ha link 1</a>
<a href="#" id="link2">ha link 2</a>
<a href="#" id="link3">ha link 3</a>
<a href="#" id="link4">ha link 4</a>
<a href="#" id="link5">ha link 5</a>
<script type="text/javascript">
for (i = 1; i <= 5; i++) {
(function() {
var x = i;
document.getElementById('link' + i).onclick = function() { alert(x); return false; }
})(); // invoking it now!
}
</script>
Если мы уберем var
перед x
, то это глобальная x
, поэтому в новой области видимости локальная переменная x
не создается, и, следовательно, нажав на ссылки, вы получите все тот же номер, который является значением глобального x
.
Обновление: вопрос в том, что мы должны быть осторожны при анализе кода, чтобы функция не создавала область видимости, когда она просто определена и назначена. Это должно быть вызвано. Это так?