Автор оригинала: Avinash Ketkar.
Повешенная петля настолько печально известна в JavaScript, что каждый ветеран JS должен был наступить на это, вновь в жизни. То, что я обнаружил, это не остается более страшным и печально известным, как только вы знаете, что это такое. Я больше не нахожу это смертельным. Что это? Вот то, что я понял: в петле конструируют язык JavaScript, есть счетчик счетчика, которая отслеживает, сколько раз итерации цикла. И есть другое место, где мы храним, сколько раз петля должна быть итерация. Я называю это «MaxCount». Это «должна» вещь для «для» петлей, но мы можем организовать его по-другому, в то время как петли. И раз, контроль выходит из цикла, переменная «счетчик» равна «MaxCount». У него все еще есть эта ценность. Это правда, по крайней мере для JavaScript. Возьмите этот фрагмент, вы найдете широко, на любом сайте или блоге о предмете «печально известной петлей».
**** Функция AddLinks () {for (var, link; i <5; i ++) {.createelement (“A”); + Я; () {оповещение (I); }; Document.body.appendChild (ссылка); }}
Window.Onload; ****
Установлено, что этот пример настолько «печально известным», поэтому «печально известным», что вы можете найти его, по крайней мере, по крайней мере в домоне мест, обсуждающих эту тему.
Этот пример добавляет пять ссылок на документ с функцией, прикрепленной к его событию OnClick. Я предполагаю, что вы, безусловно, умны и остроумны, чтобы знать, что, как я представляю этот видимо очевидный пример, там должно быть что-то грязное. На самом деле, нет ничего грязного. Переменная «I» увеличивается в каждой итерации, и в конце он является «5», поэтому каждая ссылка покажет предупреждение «5», а не «1», «2», «3», «4», «5», как вы могли ожидать. Когда вы беритет в куче так много тысяч линий кода, даже если вы знаете эти вещи, иногда вы совершаете такие «ошибки». Средство – это прекратить работу некоторое время, (я имею в виду для короткой продолжительности, а не цикл Whime) прогуляться по 10-15 минут (только), а затем взглянуть на код, сложно в отдельной позиции, как будто Это чужой код.
Это еще один «печальный» пример.
** Функция дошутного (MSG) {Console.log (MSG); }
var messages = [“Hello”, 42, {pi: 3.14}]; VAR буфер = [];//1.
для (var; i //… ** для (var; j Найдено здесь: http://bingcode.blogspot.in/2012/10/the-javascript-infamous-loop-problem.html, чтобы процитировать линии из того же вышеуказанного места: Что здесь случилось? Проблема в том, что переменная петли на самом деле не такая. Итак, когда в (3) мы называем DOSHOUTHTHOTH-Stone () через буфер, индекс – это текущее значение (фактически, длина массива сообщений), а не его значение, когда в (2) мы присваивали функцию буфера. Тогда, что ведь, «закрытие»? Мои дорогие друзья, что еще я обсуждал на последнюю пару сообщений? Это закрытие, насколько я понял. Понимание областей, внутренних блоков, глобального пространства, внутри функций и петлей, внутренние петли и рекурсивные петли, рекурсивные функции, функции внутри функций, вот и все. Я наткнулся на все программисты, которые на самом деле используют такие сложные вещи, не зная, что он называл, и, в другой путь, я наткнулся, некоторые другие, которые знают все это, но вряд ли могут справиться с фактической сложностью во время кодирования. Я наткнулся на некоторое мнение ошеломляющих заявлений, читая о закрытиях, как, когда вы определяете функцию, вы на самом деле определяете закрытие. Все, что прилагается внутри «{» и «}», на самом деле находится закрытие. Лучший подход, ИМХО, копает как, работа требует. Понять, как это работает, как и, теория позади этого. Не погружайтесь так много в терминологии, что вы забываете реализацию и не участвуете так много в реализации, что вы игнорируете теорию. И вот закрытие.