2009-12-04 1 views
4

Некоторое время назад я поставил вопрос о what questions should a good javascript coder be able to answer. Meder указал на следующий вопрос:Как скопировать значение ссылки в 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 быть копией ссылочного значения, а не фактической ссылкой?

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

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

+0

Это один из наиболее часто задаваемых вопросов, проверьте мой ответ и комментарий в этом вопросе: http://stackoverflow.com/questions/1804438/#1804452 – CMS

ответ

3

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

Вот «stantard» решение:

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

Есть идеи?

+0

Получил идею! благодаря! –

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

возможно?

+1

Вы * почти * там ... подсказка: у вас есть чтобы захватить переменную 'i', передав ее как аргумент функции самоисполнения ... – CMS