Область действия переменной анонимной функции jQuery - PullRequest
4 голосов
/ 16 августа 2011

Может кто-нибудь объяснить, почему не работает следующее :

function displayResults(data) {
    $("#odNextPage").click(function() {
        alert(data.queryType); // "undefined"
        return false;
    });
}

Почему я могу использовать объект данных внутри анонимной функции click?

Редактировать : Свойство queryType фактически не было установлено, что, по-моему, вызвало проблему, извините. Мне все еще было бы интересно, чтобы кто-то объяснил, почему теперь работает , учитывая, что функция щелчка выполняется вне области объекта данных.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

То, что вызывает 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.Но переменная только ссылается (или указывает) на объект в памяти, и этот объект, более или менее, будет соприкасаться, пока никто больше не ссылается на него.

Имя переменной и названный объект являются отдельными объектамис отдельными жизнями.Цитируя Брюса Ли:

Не концентрируйтесь на пальце, иначе вы упустите всю небесную славу.

Вы не можете уйти от указателей в программированиидаже когда они не называются указателями.

0 голосов
/ 16 августа 2011

Вы должны использовать геттеры и сеттеры для отслеживания ваших переменных, независимо от области видимости.

var data = {};
setDataQueryType('post');

$("#odNextPage").click(function() {
    alert(getDataQueryType()); // 'post'
    setDataQueryType('get');
    alert(getDataQueryType()); // 'get'
    return false;
});

// Getter for query type
function getDataQueryType() {
    return data.queryType;
}

// Setter for query type
function setDataQueryType(val) {
    data.queryType = val;
}
...