Глобальные переменные в JS/Jquery между функциями

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

Я хотел бы иметь возможность получать значения var в основной функции щелчка и использовать их в функции nu() без повторного использования

var itemTitle = $("input#add_item_item_title").val();

чтобы определить другое время.

Я был уверен, что это возможно, но, возможно, я что-то упустил.

JS/JQ

$(document).ready(function(){
  init();
});


function init() {
    $(function() {
      $('.error').hide();
      $(".add_item_btn").click(function() {
            // validate and process form here

            $('.error').hide();
            var itemTitle = $("input#add_item_item_title").val();
              if (itemTitle == "") {
              $("label#add_item_item_title_error").show();
              $("input#add_item_item_title").focus();
              return false;
            }

            //add_item();
            nu();
            return false;  
      });
    });
}



function nu(){
   // when using this the var is defined but would rather not have to reuse this//
   var itemTitle = $("input#add_item_item_title").val();
   /////////////////////////////////////////////////////////////////////

   var url = "script.php";
    $.ajax({
                type: 'POST',
                url: url, 
                dataType: 'html',
                data: {
                    itemTitle: itemTitle,
                    groupID: groupID, 
                    unitPrice: unitPrice        
                },
                beforeSend: function() {
                        document.getElementById("message").innerHTML="<span class='blink_me'>Sending..</span>"  ;
                },
                success: function(html) {
                        document.getElementById("message").innerHTML=itemTitle;

                }
    });

}

person Derple    schedule 19.03.2014    source источник
comment
Вы не используете глобалы. Глобальные переменные определены за пределами вершины: $(document).ready(function(){});   -  person Fallenreaper    schedule 19.03.2014
comment
Вам нужно узнать об областях видимости и замыканиях   -  person David Chase    schedule 19.03.2014
comment
Конечно, знаю! спасибо Давид!   -  person Derple    schedule 19.03.2014


Ответы (1)


Удалите var в объявлении вашей переменной.

Уточнение: вы определяете эту переменную с помощью var, поэтому она доступна только в рамках этой функции и любых функций, определенных непосредственно в ней. Если вы просто используете myVar = 15; (без var), переменная будет определена в глобальной области видимости. В браузере это эквивалентно использованию window.myVar = 15.

Дальнейшее уточнение: использование глобальных переменных обычно означает, что вы делаете то, чего не должны делать. Я не пурист, но мне кажется, что многие люди будут ругаться. Вы рискуете переназначить эту глобальную переменную на другое значение до того, как ваша функция обратного вызова будет запущена - отладка таких проблем с областью действия может быть головной болью.

В вашем примере, почему бы просто не передать переменную в функцию, например nu(itemTitle);:

function nu(itemTitle){
    /* blah blah blah */
    /*
     * itemTitle is now available here and directly
     * in any functions that are defined in this
     * part of the code
     */
}
person MjrKusanagi    schedule 19.03.2014
comment
Сработало, так что я понимаю, что не использовал глобальные переменные, но есть ли непосредственные проблемы с тем, чтобы не объявлять var перед var? Спасибо - person Derple; 19.03.2014
comment
Я не вижу никаких проблем, основанных на коде, который вы написали здесь. Но если бы какая-то другая функция изменила значение itemTitle перед ответом сервера, у вас возникла бы потенциальная ошибка. Такие ошибки могут ДЕЙСТВИТЕЛЬНО разочаровывать, потому что они могут не отображаться в вашем тестовом экземпляре. - person MjrKusanagi; 19.03.2014
comment
обновление передаваемой переменной в функцию не сработало. Однако удаление var сработало. - person Derple; 19.03.2014
comment
Передача переменной в функцию почти наверняка сработает (я уверен примерно на 99,9%). Вы хотите опубликовать ссылку jsfiddle.net с вашим обновленным кодом JS с передачей переменной? - person MjrKusanagi; 19.03.2014
comment
Вам нужно позвонить nu(itemTitle);, а не только nu();. - person MjrKusanagi; 19.03.2014