Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.02.2014, 21:42
Интересующийся
Отправить личное сообщение для Papa Посмотреть профиль Найти все сообщения от Papa
 
Регистрация: 16.12.2009
Сообщений: 19

Не видит переменную при ее инициализации в колбеке
function func(id) {	
	$.ajax({
		type: "post",			
		url: host+'/structure/branch',
		data: {id: id, type: 'all'},
		success: function(a) {
			alert(id); // undefined
			var id = 1;	
		}
	});
}
func(0);

Пока не разбирался, может так идолжно быть но это как минимум странно, почему id == undefined
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2014, 22:15
Интересующийся
Отправить личное сообщение для Nodeveloper Посмотреть профиль Найти все сообщения от Nodeveloper
 
Регистрация: 01.02.2014
Сообщений: 11

Потому что на момент вызова кода, переменная id определена, но не инициализирована, т.е. undefined.
Перед выполнением функции, интерпретатор ищет все упоминания var в теле функции, и определяет переменные в ее начале.
Код из вашего примера с точки зрения интерпретатора эквивалентен следующему коду:
function(a) {
            var id; // id === undefined
            alert(id); // undefined
            id = 1; // id === 1
        }


Вам нужно просто убрать var перед id в коллбэке, но тогда следует помнить, что все другие функции, заданные внутри func(id) и вызванные после того, как придет ответ от сервера, получат значение 1 в переменной id, т.е.
function func(id) {
        var func2 = function () {
               alert (id) // 1
        };	
	$.ajax({
		type: "post",			
		url: host+'/structure/branch',
		data: {id: id, type: 'all'},
		success: function(a) {
			alert(id); // undefined
			id = 1;	
                        func2();
		}
	});
}
func(0);
Ответить с цитированием
  #3 (permalink)  
Старый 01.02.2014, 23:29
Интересующийся
Отправить личное сообщение для Papa Посмотреть профиль Найти все сообщения от Papa
 
Регистрация: 16.12.2009
Сообщений: 19

странно то что в обычной функции поведение другое
function func(id) {	
	alert(id); // 0
	var id = 1;
}
func(0);

Последний раз редактировалось Papa, 01.02.2014 в 23:32.
Ответить с цитированием
  #4 (permalink)  
Старый 02.02.2014, 04:36
Интересующийся
Отправить личное сообщение для Nodeveloper Посмотреть профиль Найти все сообщения от Nodeveloper
 
Регистрация: 01.02.2014
Сообщений: 11

Потому что, в этом случае переменная id уже находится в function-local scope.

function func(id) {	
        var id; // 0
	alert(id); // 0
	id = 1; // 1
}
func(0);


В первом же случае, переменная id определена не в function-local scope, а в родительском scope.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить функцию при запуске увидеть ГЛОБАЛЬНУЮ переменную? возжаждавший Элементы интерфейса 8 23.02.2017 01:27
getAllResponseHeaders() и status имеют смысл только при readyState==4? mister_maxim AJAX и COMET 7 27.03.2011 19:08
Ссылка на себя при инициализации объекта folibis Общие вопросы Javascript 2 22.11.2010 11:48
Изменение стиля родительского элемента при :hover дочернего lanzs Элементы интерфейса 2 16.10.2010 13:28
Проблема при инициализации событий sms9 Events/DOM/Window 2 21.01.2010 22:14