Как скопировать значение ссылки в JavaScript? - PullRequest
4 голосов
/ 04 декабря 2009

Некоторое время назад я опубликовал вопрос о , на какие вопросы должен отвечать хороший кодировщик 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>

Вопрос: как это исправить? реализация так, чтобы онклик Функция содержит значение I, а не это ссылка?

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

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

Любые мысли приветствуются.

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Чтобы понять эту проблему, вы должны узнать, что такое замыкание . Затем вы также должны знать, как 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:

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

Есть идея?

1 голос
/ 04 декабря 2009
<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>

возможно

...