Область действия в обработчике кликов JQuery - PullRequest
1 голос
/ 05 января 2011

У меня есть функция, в которой я получаю некоторые данные и вставляю их в строку таблицы.

Затем я настраиваю событие щелчка в строке, чтобы при его нажатии он переходил кURL, указанный в моем объекте данных:

$(data).each(function(i, item) {

    var row = $("<tr></tr>");
    tbody.append(row);

    // Add some cells into the row...
    var firstNameCol = $("<td>" + item.FirstName + "</td>");
    row.append(firstNameCol);

    // Set up click handler
    row.click(function() {
       window.location.href = item.DetailsURL;
    });
 });

Теперь этот код работает нормально, но я понял, что я не уверен, как работают события.

Функция содержит ссылкув item, которая является локальной переменной для цикла for.Когда пользователь нажимает на строку, как он узнает, на какой элемент он смотрит?Это как-то кэшируется при регистрации функции щелчка?

Во-вторых, действительно ли этот метод плох?Я заставляю его выполнять закулисную работу?

Редактировать Добавлен дополнительный код ...

1 Ответ

2 голосов
/ 05 января 2011

item - это переменная, доступная в этой области при привязке , поэтому анонимная функция, которую вы передаете в функцию .click(), просто получает ее копию (или ссылка, если это объект) в то время .

Вы могли бы назвать это «кэшированным», конечно, но это просто ссылка или копия переменной, которую он получает в этот момент. .each() создает замыкание, функцию обратного вызова, которую вы передаете ему (function(i, item) {...}), и внутри него (в зависимости от того, объект это или нет, в этом случае вы получаете ту же ссылку) Ваша собственная копия для этой итерации цикла.

Что касается производительности, то на самом деле это не «нагрузка на работу», это совершенно нормально.

...