Это разрешено?
Работает, конечно.
Зависит от того, что вы подразумеваете под «разрешено».
- Это сбивает с толку - возможно.
- Может ли это вызвать проблемы - определенно.
(Есть много вопросов о SO или проблемах, вызванных этим, которые подтверждают, что это вызывает проблемы).
Повторное использование имен переменных (в данном случае «this») является распространенным явлением и основано на scope .
Трудно сказать, есть ли у вас ошибка, потому что вы на самом деле хотели html ".edit" или attr ".edit", а не div
, поэтому вы можете устранить эту путаницу, скопировав this
в переменную :
$(document).on( "click", ".edit", function() {
var data = {};
var btn = $(this); // the button that was clicked
btn.closest('.row').children('div[name]').each(function() {
// Do you mean the div or did you really mean the clicked button?
data[$(this).attr('name')] = $(this).html();
var div = $(this); // the child div
// clearly not what is desired
// `btn` variable referring to the outer `this`
data[div.attr('name')] = btn.html();
// intention clear
data[div.attr('name')] = div.html();
});
$('#result').html(JSON.stringify(data, null, 4));
});
В данном случае это "ясно", поскольку вы не будете использовать btn html для всех записей данных (или не так ли? Я не знаю ваших требований ...). Так что "вряд ли".
Но легко увидеть, как в другом сценарии вы хотели бы сослаться на то, что было нажано btn==this
внутри вложенного .each
.