Объем переменной jQuery после вызова функции? - PullRequest
1 голос
/ 11 ноября 2011

У меня есть эта функция

function update_prices(product_selector){
    //kind of a hack to account for the sometimes having a professional price and sometimes not
    var price_count = product_selector.find('small.rt').length;
    for (i=0;i<=price_count;i++)
    {
        if(i == 0){
            var standard_selector = product_selector.find('small.rt:eq('+ i +')');
            var standard_price = standard_selector.attr('data');
        }
        if(i == 1){
            var business_selector = product_selector.find('small.rt:eq('+ i +')');
            var business_price = business_selector.attr('data');
        }
        if(i == 2){
            var professional_selector = product_selector.find('small.rt:eq('+ i +')');
            var professional_price = professional_selector.attr('data');
        }
    }
}

и у меня есть этот кусок кода, который вызывает его

....
....
product_selector.find(".active_selector").removeClass('active_selector');
update_prices(product_selector);
....
....

standard_selector.text("something");
business_selector.text("something else");
professional_selector.text("another thing");

Мой вопрос заключается в том, как сохранить область видимости для трех переменных standard_selector business_selector и professional_selector, которые создаются в функции update_prices

Ответы [ 2 ]

5 голосов
/ 11 ноября 2011

Чтобы сохранить эти переменные постоянными после объявления функции, у вас есть следующие варианты:

  1. Они должны быть объявлены в области более высокого уровня, которая сохраняется в течение необходимого вам периода времени.
  2. Они должны быть глобальными переменными, которые сохраняются в течение всего срока службы веб-страницы.
  3. Их необходимо назначить в качестве свойств некоторого объекта, который сохраняется в течение требуемой продолжительности. Это может быть сделано путем возврата объекта с этими значениями из функции или передачи объекта в функцию, для которой можно установить свойства, или с помощью глобального объекта, который присваивает свойства.

Самое простое решение (считалось не всегда лучшим) - сделать их глобальными переменными, объявив их в более широкой области видимости и удалив перед ними var в функции, так что вы просто работаете с глобальными переменными вместо используя локальные переменные:

// declare global variables in global scope
var standard_selector;
var business_selector;
var profession_selector;

function update_prices(product_selector){
    //kind of a hack to account for the sometimes having a professional price and sometimes not
    var price_count = product_selector.find('small.rt').length;
    for (i=0;i<=price_count;i++)
    {
        if(i == 0){
            standard_selector = product_selector.find('small.rt:eq('+ i +')');
            var standard_price = standard_selector.attr('data');
        }
        if(i == 1){
            business_selector = product_selector.find('small.rt:eq('+ i +')');
            var business_price = business_selector.attr('data');
        }
        if(i == 2){
            professional_selector = product_selector.find('small.rt:eq('+ i +')');
            var professional_price = professional_selector.attr('data');
        }
    }
}

Или, если вы просто хотите вернуть их из этой функции, чтобы вы могли использовать их на уровень выше, то вы можете вернуть их в объекте:

function update_prices(product_selector){
    //kind of a hack to account for the sometimes having a professional price and sometimes not
    var sel = {};
    var price_count = product_selector.find('small.rt').length;
    for (i=0;i<=price_count;i++)
    {
        if(i == 0){
            sel.standard_selector = product_selector.find('small.rt:eq('+ i +')');
            var standard_price = standard_selector.attr('data');
        }
        if(i == 1){
            sel.business_selector = product_selector.find('small.rt:eq('+ i +')');
            var business_price = business_selector.attr('data');
        }
        if(i == 2){
            sel.professional_selector = product_selector.find('small.rt:eq('+ i +')');
            var professional_price = professional_selector.attr('data');
        }
    }
    return(sel);
}

var selectors = update_prices(xxx);
// access selectors.standard_selector, selectors.business_selector, selectors.profession_selector here
4 голосов
/ 11 ноября 2011

вернуть их как объект

function update_prices(product_selector){
    ...
    return {standard_selector:standard_selector, business_selector:business_selector, professional_selector}
}

var r = update_prices(product_selector);
r.standard_selector.text("something");
r.business_selector.text("something else");
r.professional_selector.text("another thing");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...