Переменная Область будет превышена - PullRequest
0 голосов
/ 08 марта 2011

У меня следующий исходный код:

<html>
<head><script type="text/javascript"> 
      function test() 
      { 
        var links = document.getElementsByTagName('a'); 
        for(var i=0; i< links.length; i++) 
        { 
          var link = links[i]; 
          if(link.href) 
          { 
            link.onclick = function() {alert("temp" + i); return false;}; 
          }; 
        }; 
      };
    </script> 
  </head> 
  <body onLoad="test()"> 
    <p><a href="javascript.html">test1</a></p> 
    <p><a href="javascript.html">test2</a></p> 
    <p><a href="javascript.html">test3</a></p> 
  </body> 
</html>

Теперь, если я нажму на каждую ссылку, браузер покажет мне тот же результат

temp3

Я использовал Firebug для профилирования кода и понял, что он принимает последнее значение переменной i.У меня первый вопрос. Почему браузер всегда использует последнее значение из переменной?2-й Как я могу изменить исходный код, чтобы браузер показывал мне «temp1», «temp2» и т. Д.?

Спасибо

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Функция onclick получает только ссылку от до i, а не копию ее значения. Поскольку значение продолжает изменяться в течение итераций цикла, и поскольку после этого вызывается функция onclick, значение i всегда будет links.length.

Чтобы исправить это, вы хотите сохранить копию переменной. Обычный подход заключается в переносе функции в другую, которая создается и вызывается немедленно, передавая текущее значение i:

(function (new_i) {
    link.onclick = function() {alert("temp" + new_i); return false;}; 
})(i);
2 голосов
/ 08 марта 2011

Я уверен, что в stackoverflow.com есть ошибки. У меня есть ссылка, доступная в другой вкладке, вот она: Создание замыканий в циклах - распространенная ошибка

Вот обман: Stackoverflow.com - Пожалуйста, объясните использование javascript замыканий в циклах - который дает два основных способа решения проблемы.

0 голосов
/ 08 марта 2011
<html>
<head><script type="text/javascript"> 
      function test() 
      { 
        var links = document.getElementsByTagName('a'); 
        for(var i=0; i< links.length; i++) 
        { 
          var link = links[i]; 
          if(link.href) 
          { 

              link.onclick = (function(i) { return
                  function() {alert("temp" + i); return false;}; }) (i);
          }; 
        }; 
      };
    </script> 
  </head> 
  <body onLoad="test()"> 
    <p><a href="javascript.html">test1</a></p> 
    <p><a href="javascript.html">test2</a></p> 
    <p><a href="javascript.html">test3</a></p> 
  </body> 
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...