То, что вызывает displayResults
, контролирует data
не только когда вызывается функция, но и когда она возвращается (и, следовательно, до вызова вашего обратного вызова).Последовательность вызова может выглядеть следующим образом:
data = { /* interesting things */ };
displayResults(data);
delete data.queryType;
// Time passes and then your callback gets called
// but data.queryType is undefined.
Я не знаю точных обстоятельств вашей ситуации, но вышеизложенное суммирует, что может произойти.
Когда вы создаете замыкание свыше data
вы ухватились за data
, но это не значит, что вы заперли то, что внутри data
.
Теперь, когда мы знаем, откуда исходит data
и почему это былов первую очередь, мы можем рассмотреть, почему он работает, когда data
является правильным и оставлен в покое.
Когда вы создаете свою анонимную функцию обратного вызова:
function() {
alert(data.queryType);
return false;
}
вы создаетезамыкание, которое содержит ссылку на data
(или, точнее, на то, на что указывает data
) и data
, не будет уничтожено, пока никто не ссылается на него.Время жизни переменной зависит от ее области действия;ваша переменная data
живет внутри вашей функции displayResults
.Но переменная только ссылается (или указывает) на объект в памяти, и этот объект, более или менее, будет соприкасаться, пока никто больше не ссылается на него.
Имя переменной и названный объект являются отдельными объектамис отдельными жизнями.Цитируя Брюса Ли:
Не концентрируйтесь на пальце, иначе вы упустите всю небесную славу.
Вы не можете уйти от указателей в программированиидаже когда они не называются указателями.