Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.05.2015, 20:49
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

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

Почему не меняется значение глобальной переменной 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"

});
Ответить с цитированием
  #2 (permalink)  
Старый 28.05.2015, 20:55
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

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 он изменяется
Ответить с цитированием
  #3 (permalink)  
Старый 28.05.2015, 20:59
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

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

Последний раз редактировалось KosBeg, 28.05.2015 в 21:05.
Ответить с цитированием
  #4 (permalink)  
Старый 28.05.2015, 21:07
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

armidoll,
прочитай про AJAX. Твой алерт выводит переменную до того, как у неё изменится значение.
Ответить с цитированием
  #5 (permalink)  
Старый 28.05.2015, 21:24
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

<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

Последний раз редактировалось KosBeg, 29.05.2015 в 08:08.
Ответить с цитированием
  #6 (permalink)  
Старый 28.05.2015, 22:11
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

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

KosBeg,
тоже спасибо, мне скорее было интересно "почему", а не "как"
Ответить с цитированием
  #7 (permalink)  
Старый 29.05.2015, 00:12
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

armidoll,
Цитата:
Я так понял, что alert() выполнился раньше, чем выстрелил .done() для $.getJSON() ?
Да.
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2015, 21:54
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

Сообщение от armidoll
Я так понял, что alert() выполнился раньше,
Не раньше и не позже, а просто все мгновенно выполнилось и уперлось в алерт.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Через argument.callee не получается переписать функцию. Jurasmi Общие вопросы Javascript 2 23.03.2011 12:54
Как вывести возвращаемое функцией значение не через модальное окно? Bandicoot Общие вопросы Javascript 1 10.03.2011 18:34
Изменить значение переменной функции через select Fenec Элементы интерфейса 5 13.08.2010 15:32
Получить значение ID через this gcolor Events/DOM/Window 5 14.01.2009 18:05
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25