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

У меня возникли проблемы с захватом значения глобальной переменной в моем обратном вызове $.get():

Соответствующая разметка

<div class="block" id="blog"></div>
<div class="block" id="music"></div>
<div class="block" id="video"></div>

Соответствующий код

$('div.block').each(function() {

 $this_id = $(this).attr('id');

 alert($this_id); // outputs: blog, music, video

 $.get('test.php', {id: $this_id}, function(data) {

  alert($this_id); // outputs: blog, blog, blog (WHY?)

  $('div#' + $this_id).html(data);

 });
});

Я пытаюсь получить HTML-контент и вставить его в каждый из разделов block, но $this_id не изменяется внутри вызова $.get(). Кто-нибудь может это объяснить?


person Community    schedule 24.12.2009    source источник


Ответы (1)


Вы должны определить $this_id в области действия функции, иначе по умолчанию она будет глобальной переменной. Просто измените это:

$this_id = $(this).attr('id');

к этому:

var $this_id = $(this).attr('id');

В любом случае, неплохо завести привычку явно объявлять все ваши переменные... Так намного проще отслеживать их.

person Shog9    schedule 24.12.2009
comment
хммм... это решает проблему, даже я пока не совсем понимаю использование var. БОЛЬШОЕ СПАСИБО - person ; 24.12.2009
comment
@BigBalaBoom: var объявляет переменную, сообщая интерпретатору, какой областью действия она будет ограничена. Вы можете объявить переменную, просто используя ее где-нибудь, но (за некоторыми исключениями) это приведет к тому, что она останется в глобальной области видимости. См.: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/ - person Shog9; 24.12.2009