Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Глобальная переменная: не передается новое значение через функцию (https://javascript.ru/forum/misc/56082-globalnaya-peremennaya-ne-peredaetsya-novoe-znachenie-cherez-funkciyu.html)

armidoll 28.05.2015 20:49

Глобальная переменная: не передается новое значение через функцию
 
Доброго времени суток!

Почему не меняется значение глобальной переменной costCalculator в коде ниже?

Код:
var costCalculator = "initial"; // Определяем и задаем значение глобальной переменной

$(function (){

    $.ajax({
       beforeSend: function(xhr){
           if (xhr.overrideMimeType){
               xhr.overrideMimeType('application/json');
           }
       }
    });

    function loadCostCalculator(){
        $.getJSON('data/test.json')
            .done( function(data){
                costCalculator = data; // Проблема где-то в этом месте
                $('#calcBody').html('Success! Калькулятор загружен'); // Выводит это сообщение
            }).fail( function(){
                $('#calcBody').html('Failure! В настоящий момент мы не можем загрузить калькулятор');
            });
    }

    loadCostCalculator();

    alert(costCalculator); // Выводит первоначальное значение "initial"

});

KosBeg 28.05.2015 20:55

var costCalculator = "initial"; // Определяем и задаем значение глобальной переменной

$(function (){

    $.ajax({
       beforeSend: function(xhr){
           if (xhr.overrideMimeType){
               xhr.overrideMimeType('application/json');
           }
       }
    });

    function loadCostCalculator(){
        $.getJSON('data/test.json')
            .done( function(data){
                var costCalculator = data; // Проблема где-то в этом месте
                $('#calcBody').html('Success! Калькулятор загружен'); // Выводит это сообщение
            }).fail( function(){
                $('#calcBody').html('Failure! В настоящий момент мы не можем загрузить калькулятор');
            });
    }

    loadCostCalculator();

    alert(costCalculator); // Выводит первоначальное значение "initial"

});

поменял строку "costCalculator = data;" на "var costCalculator = data;"
должно работать
если объект создавался при помощи var - то значит и при помощи var он изменяется

KosBeg 28.05.2015 20:59

PPS: ИЗВИНЯЮСЬ, У МЕНЯ СЛУЧИЛАСЬ ОШИБОЧКА, ПРОБЛЕМА НЕ В ЭТОМ!!!

Safort 28.05.2015 21:07

armidoll,
прочитай про AJAX. Твой алерт выводит переменную до того, как у неё изменится значение.

KosBeg 28.05.2015 21:24

<script src='http://code.jquery.com/jquery-2.1.4.js'></script>

<script type="text/javascript">
var costCalculator = "initial"; // Определяем и задаем значение глобальной переменной

$(function (){

    $.ajax({
       beforeSend: function(xhr){
           if (xhr.overrideMimeType){
               xhr.overrideMimeType('application/json');
           }
       }
    });

    function loadCostCalculator(){
        $.getJSON('test.json')
            .done(function(data){
                alert('до' + costCalculator);
                costCalculator = data;
                alert('после' + costCalculator);
                $('#calcBody').html('Success! Калькулятор загружен'); // Выводит это сообщение
            }).fail( function(){
                $('#calcBody').html('Failure! В настоящий момент мы не можем загрузить калькулятор');
            });
    }

    loadCostCalculator();

});

</script>


PS: пришлось на скорую руку розбираться в синтаксисе JQuery(раньше практически не работал с ним), немного посмотрел и понял - лучше уже писать на чистом JavaScript и полифилах чем на JQuery

armidoll 28.05.2015 22:11

Safort, спасибо.
Я так понял, что alert() выполнился раньше, чем выстрелил .done() для $.getJSON() ?

KosBeg,
тоже спасибо, мне скорее было интересно "почему", а не "как"

Safort 29.05.2015 00:12

armidoll,
Цитата:

Я так понял, что alert() выполнился раньше, чем выстрелил .done() для $.getJSON() ?
Да.

kostyanet 29.05.2015 21:54

Цитата:

Сообщение от KosBeg
пришлось на скорую руку розбираться в синтаксисе JQuery

Делается наоборот. Вы пишите на js свои решения, а кому надо тот переводит на свой язык.

Цитата:

Сообщение от armidoll
Я так понял, что alert() выполнился раньше,

Не раньше и не позже, а просто все мгновенно выполнилось и уперлось в алерт.

Потому что проверять надо не алертами, а логами. В консоль валить, хотя и там бывают лаги. Алерты вас могут вообще запутать. Например пока вы тянетесь к кнопке ОК - ответ с сервера уже пришел, но ничего не происходит пока модальный диалог не закроется. Вы его закрываете - бамц все сработало. Типа вот что алерт животворящий делает.


Часовой пояс GMT +3, время: 07:23.