проблема объема JavaScript, когда функция лямбды относится к переменной во включении цикла

Первый вопрос на stackoverflow :) Надежда я не опозорюсь...

У меня есть функция JavaScript, которая загружает список альбомов, и затем это создает элемент списка для каждого альбома. Элемент списка должен быть активируемым по щелчку, таким образом, я называю щелчок jQuery () с функцией, которая действительно наполняет. Я делаю это в цикле. Моя проблема состоит в том, что все объекты, кажется, получают ту же функцию щелчка, даже при том, что я пытаюсь сделать новый, который делает другой материал в каждом повторении. Другая возможность состоит в том, что итеративная переменная глобальна так или иначе, и функция относится к ней. Код ниже. отладка () является просто инкапсуляцией console.debug Firebug ().

function processAlbumList(data, c) {
 for (var album in data) {
  var newAlbum = $('<li class="albumLoader">' + data[album].title + '</li>').clone();
  var clickAlbum = function() {
   debug("contents: " + album);
  };
  debug("Album: " + album + "/" + data[album].title);
  $('.albumlist').append(newAlbum);
  $(newAlbum).click(clickAlbum);
 }
}

Вот расшифровка стенограммы того, что она печатает, когда вышеупомянутая функция выполнения, после этого некоторые строки отладки, вызванные мной нажимающий на различные объекты. Это всегда печатает "10", который является последним значением, которое переменная альбома принимает (существует 10 альбомов).

Album: 0/Live on radio.electro-music.com
Album: 1/Doodles
Album: 2/Misc Stuff
Album: 3/Drawer Collection
Album: 4/Misc Electronic Stuff
Album: 5/Odds & Ends
Album: 6/Tumbler
Album: 7/Bakelit 32
Album: 8/Film
Album: 9/Bakelit
Album: 10/Slow Zoom/Atomic Heart
contents: 10
contents: 10
contents: 10
contents: 10
contents: 10

Какие-либо идеи? Управляя мной стена, это.:)

/Stefan

7
задан TV's Frank 13 May 2010 в 21:13
поделиться

2 ответа

Вам необходимо ввести другую область видимости, например такую:

var clickAlbum = (function (a) {
    return function () {
        debug("contents: " + a)
    };
})(album);
8
ответ дан 7 December 2019 в 05:18
поделиться

Переменная album во внутренней функции является закрытием, однако ее значение не привязано при объявлении каждой функции. Это означает, что каждый раз при прохождении цикла закрытие альбома будет изменено на значение, которое оно имеет в этом цикле. Здесь есть более подробное объяснение

. Как предлагает Шон (и статья), вы можете решить эту проблему, изменив область видимости переменной.

0
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: