Вопрос

Некоторое время назад я опубликовал вопрос о на какие вопросы должен уметь отвечать хороший javascript-кодер.Медер указал на следующий вопрос:

Следующий код вызывает щелчки по любому элементу "a" для оповещения (-1) из-за того, что "i" хранится в функции onclick как ссылка, а не как значение:

<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>

Вопрос в том,:Как это исправить реализация так, чтобы onclick функция содержала значение i, а не это ссылка?

Я не знаю ответа.Как это исправить?Как сделать так, чтобы i был копией ссылочного значения, а не фактической ссылкой?

Побочные вопросы:Все ли типы переменных передаются в качестве ссылки?Или это зависит от того, является ли это типом примитива или объектом?

Любые мысли были бы оценены.

Это было полезно?

Решение

Чтобы понять эту проблему, вы должны узнать, что такое закрытие есть.Тогда вы также должны знать, как javascript справляется с областью видимости (это на основе функций, а не на основе блоков, как, например, C).

Вот "стандартное" решение:

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

Другая версия, которая делает именно так то же самое, но, возможно, это будет легче понять, если вы не привыкли к замыканиям и области видимости в JS is:

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

Уловил идею?

Другие советы

<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() {
        return function() {
           alert(i);
           return false;
        }
    }();
}
</script>

может быть?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top