Во -первых, давайте посмотрим на кусок кода:
Кода -копия выглядит следующим образом:
<a href = "javascript: void (0);"> 111 </a>
<a href = "javascript: void (0);"> 222 </a>
<a href = "javacsript: void (0);"> 333 </a>
var a = document.getElementsbytagname ("a");
функция b () {
for (var i = 0; i <a.length; i ++) {
a [i] .onclick = function () {
оповещение (i);
}
}
}
Согласно нашему первоначальному намерению дизайна, это должно быть нажать на тег A, чтобы вспять соответствующий серийный номер тега, то есть нажмите на первый A, чтобы всплыть 0, и нажмите на второй, чтобы всплыть 1 ... но факт в том, что количество тегов всегда всплывает, что всегда является номером тегов A. В чем причина? Эта проблема долго меня беспокоила. Я консультировался со многими онлайн -материалами и справочниками. Большинство из них правдоподобны. Я считаю, что многие студенты мало знают о причинах. Я расскажу о своем понимании этой проблемы. Если есть неуместность, пожалуйста, критикуйте и исправьте меня.
В моем личном понимании причина, по которой вышеуказанная функция не смогла достичь своей цели, заключается в том, что функция обработки событий связывает переменную I, а функция обработки событий назначена OnClick, то есть функция будет вызвана только тогда, когда нажимается тег. Следовательно, логически говоря, функция () {alert (i);} в простом для цикла не выполняется, и когда мы нажимаем на тег, для цикла уже был выполнен. В настоящее время значение I является конечным значением для выполнения цикла. Чтобы быть простым, значение I принадлежит к функции B, и значение I, которое нам нужно, - это значение, передаваемое функции обработки событий в режиме реального времени. Так есть ли способ осознать наше оригинальное дизайнерское намерение? Умный одноклассник, возможно, догадался, что он должен использовать закрытие.
Давайте посмотрим на другой код:
Кода -копия выглядит следующим образом:
var a = document.getElementsbytagname ("a");
функция b () {
for (var i = 0; i <a.length; i ++) {
a [i] .onclick = function (j) {
return function () {
предупреждение (J);
}
}(я);
}
}
b ();
Выполните приведенный выше код, и вы обнаружите, что функция, которую мы хотим, была реализована, то есть нажатие на любой тег A появится на серийном номере, где находится тег. Я считаю, что многие студенты видели много подобных версий приведенного выше кода, но почему мы можем выполнить необходимые нам функции, делая это? Это мое личное мнение. Если есть неуместность, пожалуйста, дайте мне несколько советов.
Суть понимания приведенного выше кода - понимание переменной i. В этом коде, когда функция выполняется и найдена цикла для цикла, обнаружена функция немедленного вызова. В настоящее время значение I-переменной в режиме реального времени передается на непосредственную функцию вызова. Функция вызывается немедленно, а функция обработки событий хранит значение переменной в реальном времени.
Выше всего об этой статье. Я надеюсь, что это будет полезно для понимания каждого закрытия JS.