Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Видимость глобальной переменной (https://javascript.ru/forum/misc/54432-vidimost-globalnojj-peremennojj.html)

opus44 17.03.2015 13:11

Видимость глобальной переменной
 
Добрый день. Помогите пожалуйста разобраться в проблеме.
Данные в глобальной переменной $data не сохраняются.
var $data = {};
var $IntervalID ='';
var $start = $('#start');
var $pause = $('#pause');

$start.on('click', function(){
//Отбираем данные и заносим их в переменную $data
// Если объект $data пустой - заполняем его
if ($.isEmptyObject($data)){
      var $numL = $('#selectL :selected').val();       
      $.ajax({
               type: 'POST',
               url: '/ajax/getData/',        	   
               dataType: 'json',
               data: {'numL': $numL},
               success: function($data){ 
                    someFunc($data);                	   	
	           },
 	           error: function(){
    		          alert("Ошибка!");
    	        }
           });        
        } else {  //в противном случае продолжаем выполнение someFunc          
            someFunc($data);
        }
});
$pause.on('click', function(){       
    clearInterval($IntervalID);
    $IntervalID = null;
}); 
function someFunc($data){
        $IntervalID = setInterval(function(){
            var $tmp = $data.shift();    
                $en_word.text($tmp.name);
        }, 1500);

};

, по нажатию на кнопку $start получаем данные и запускается функция someFunc.
Кнопка $pause приостанавливает выполнение someFunc, а при повторном нажатии кнопки $start цикл должен продолжиться с момента остановки. На практике получается что переменная $data "обнуляется" и AJAX опять отбирает данные и все начинается с начала.

Т.е. проблема в том, что данные в переменной $data не сохраняются.

ksa 17.03.2015 13:33

Цитата:

Сообщение от opus44
Данные в глобальной переменной $data не сохраняются.

В твоем варианте она глобальной почти и не бывает... :D Чаще простым параметром функции и не более того.

opus44 17.03.2015 14:09

ksa, подскажите пожалуйста, что я делаю не правильно?..

skrudjmakdak 17.03.2015 14:16

первое что мне бросилось сразу в глаза, так это $data.shift();
ведь $data у тебя не массив, а объект
открой консоль (f12) и посмотри, на том месте у тя ошибка должна вывалиться

opus44 17.03.2015 14:19

skrudjmakdak, в данном случае эта конструкция работает.

skrudjmakdak 17.03.2015 14:20

ты в $data добавил метод shift?

opus44 17.03.2015 14:24

skrudjmakdak,да. строка 33.

ksa 17.03.2015 14:25

Цитата:

Сообщение от opus44
что я делаю не правильно?

Сначала вроде как
Цитата:

Сообщение от opus44
var $data = {};

Но потом
Цитата:

Сообщение от opus44
success: function($data){/**/}

и
Цитата:

Сообщение от opus44
function someFunc($data){/**/}

что полностью убило былую "глобальность" этой переменной

Пример

var a=1;
test(5);
alert('global '+a)
function test(a){
   alert('test '+a);
};

skrudjmakdak 17.03.2015 14:26

на 33 строке ты вызываешь метод shift. а я тебя спросил про добавление
лучше, вот, почитай про отладку:
http://learn.javascript.ru/debugging-chrome

да, время потратишь на изучение. но без нее оч трудно

ksa 17.03.2015 14:26

Цитата:

Сообщение от skrudjmakdak
первое что мне бросилось сразу в глаза, так это $data.shift();
ведь $data у тебя не массив, а объект

Передаваемый параметр видать массив... ;)

opus44 17.03.2015 14:38

skrudjmakdak, большое спасибо за ссылку.

ksa, спасибо, я кажется понял в чем проблема.
Можно небольшой вопросик?
В данном случае....
var $data = {};
$start.on('click', function(){
$data = $.ajax({
               type: 'POST',
               url: '/ajax/getData/',             
               dataType: 'json',
               data: {'numL': $numL}
           });
});

, $data будет оставаться глобальной?

ksa 17.03.2015 14:41

Цитата:

Сообщение от opus44 (Сообщение 361696)
В данном случае....
var $data = {};
$start.on('click', function(){
$data = $.ajax({
               type: 'POST',
               url: '/ajax/getData/',             
               dataType: 'json',
               data: {'numL': $numL}
           });
});

, $data будет оставаться глобальной?

Если это имя нигде не станут использовать в качестве параметра функции - таки да, везде будет видна как глобальная. :yes:

opus44 19.03.2015 11:58

пытаюсь локальную переменную присвоить глобальной....но похоже опять что-то делаю не правильно..
var $data = [];
var $tmp_data = {};
$start.on('click', function(){
$.ajax({
               type: 'POST',
               url: '/ajax/getData/',            
               dataType: 'json',
               data: {'numL': $numL},
               success: function($obj){ 
                      someFunc($obj);                     
                }
           });
});
function someFunc($obj){
     $tmp_data = $.parseJSON(JSON.stringify($obj));
     $data = $.makeArray( $tmp_data);
var $IntervalID = setInterval(function(){
            {...................}
        }, 1500); 
};

...на выходе все равно получаю локальные переменные.

ksa 19.03.2015 13:23

Цитата:

Сообщение от opus44
но похоже опять что-то делаю не правильно..

По этому огрызку кода этого не видно...

Когда сработает функция someFunc() переменные $tmp_data и $data поменяют свои значения...


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