Ссылка на селектор jQuery

Простой вопрос:

Как я могу ссылаться на self без использования $.each(), например, когда я хочу установить html() для собственного атрибута?

$('*[rel]').html($(this).attr('rel')); // nope
$('*[rel]').html($(self).attr('rel')); // nah
$('*[rel]').html($(sender).attr('rel')); // undefined
$('*[rel]').html($(target).attr('rel')); // still undefined
$('*[rel]').html($(???).attr('rel')); // this isn't even correct syntax
$('*[rel]').html($(beer).attr('rel')); // well that would be tasty
$('*[rel]').html($(woman).attr('rel')); // not in this life
$('*[rel]').html($(god help me!).attr('rel')); // He probably doesn't even know how to use a computer
$('*[rel]').html($(i give up).attr('rel')); // unexpected... o'rly?

Ответ 1

Вы можете передать функцию вместо строки.

$('[rel]').html(function() {
    return $(this).attr('rel');
});

Причина, по которой все ваши примеры не работают, заключается в том, что в каждом случае ваш код выполняется задолго до того, как селектор был оценен. Это то, что вам действительно нужно понять - это еще более актуально, когда задействованы обратные вызовы, например. для AJAX или таймеров: когда вы помещаете код где-то, он выполняется в этот момент. Таким образом, foo(some code here) будет всегда выполнять код, являющийся частью аргумента функции, независимо от того, что делает foo. Единственная причина избежать этого - передать функцию, содержащую этот код - это выражение функции оценивается (которое оценивается вызываемой функцией). Тогда фактическая функция (которая, очевидно, должна ожидать вызываемого вместо простого значения) может вызывать переданную функцию всякий раз, когда она подходит.