2013-12-08 2 views
0

Почему якоря при нажатии на них предупреждают -1 вместо их соответствующего счетчика внутри цикла? Как вы можете исправить код, чтобы он предупреждал правильный номер?предупреждение -1 вместо их соответствующего счетчика внутри цикла?

<a href="#">text</a><br><a href="#">link</a> 
<script> 
var as = document.getElementsByTagName('a'); 
for (var i = as.length; i--;) { 
    as[i].onclick = function() { 
     alert(i); 
     return false; 
    } 
} 
</script> 
+0

Этот вопрос из онлайн-теста кодирования, я уверен, что это противоречит духу теста, чтобы сделать ответ настолько удобным для Google. –

ответ

3

Это проблема закрытия: каждый анонимной функции можно определить внутри цикла считывает значение «я» в конце для цикла.

Вам нужна другая область действия, например вызов функции, которая устанавливает обработчик onclick.

function add_onclick(el, i) { 
    el.onclick = function() { 
     alert(i); 
     return false; 
    } 
} 

var as = document.getElementsByTagName('a'); 
for (var i = as.length; i--;) { 
    add_onclick(as[i],i); 
} 
0

Вы печатаете значение переменной i. После цикла это значение равно -1.

1

Альтернативный способ добиться того же результата, как Keeper's answer является использование выражения функции для закрытия, который вы сразу же ссылаться, используя ваше значение в качестве параметра для создания Замыкания

var as = document.getElementsByTagName('a'); 
for (var i = as.length; i--;) (function (i) { 
    as[i].onclick = function() { 
     alert(i); 
     return false; 
    } 
}(i)); 

Этого способа требует минимального код рефакторинга

+0

@downvoter, прокомментируйте это, чтобы я мог ответить на вопрос, который у вас есть с этим ответом. –

+2

Я не дубликатор, но я думаю, что это о читаемости – Keeper

Смежные вопросы