Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Видимость переменной про onLoad (https://javascript.ru/forum/events/22836-vidimost-peremennojj-pro-onload.html)

Jambo85 02.11.2011 16:45

Видимость переменной про onLoad
 
Я только начал заниматься яваскриптом, поэтому вопрос может быть глупый. Вот код
var desc;
var img = new Image();
img.onload = function(){
var desc = true;
}
img.onerror = function(){
var desc = false;
}
img.src = '1.jpg';
alert(desc);

Почему переменной desc не передаются значения? выводит undefined.
Я догадываюсь что все дело в области видимости, но как это реализовать не знаю

ksa 02.11.2011 16:54

Цитата:

Сообщение от Jambo85
Вот код

Это таки огрызок кода...

Но даже в нём видно что переменная desc не имеет значения (т.е. не определена)...
Правда есть две функции в которых объявлены свои переменые desc. И если даже вызвать эти функции на исполнение (чего нет), это картину не изменит.

Цитата:

Сообщение от Jambo85
Я догадываюсь что все дело в области видимости

Пока до этого даже дело не дошло...

Цитата:

Сообщение от Jambo85
но как это реализовать не знаю

Реализовать что?

Jambo85 02.11.2011 17:10

Попробую по другому объяснить - необходимо предварительно проверить наличие картинки, в зависимости от результата(есть или нет) формируется строка т.е при наличии картинки на сервере выводится текст + сама картинка, если картинки нет то только текст.
Так вот данный "огрызок" кода призван проверять факт наличия изображения на сервер и выдавать результат в виде desc.
Выглядит так:
var desc;
var img = new Image();
img.onload = function(){
var desc = true;
}
img.onerror = function(){
var desc = false;
}
img.src = '1.jpg';

if (desc)
 { .... }
else { .... }

Пробовал так 
var desc;
var img = new Image();
img.onload = function(){
 desc = true;
}
img.onerror = function(){
 desc = false;
}
img.src = '1.jpg';

if (desc)
 { .... }
else { .... }

Результат тот же.
Так же заметил что в теле функций onload и onerror значение desc присваивается, но за ними desc undefined
Не ругайте, постарался изложить как мог

ksa 02.11.2011 19:57

Цитата:

Сообщение от Jambo85
Так же заметил что в теле функций onload и onerror значение desc присваивается, но за ними desc undefined

Что-то написать в функции не значит что это исполнилось... :)

Попробую объяснить...
Вот это из области видимости переменных

var test=1;
go(2);
alert(test);
set(3);
alert(test);

function go(N) {
   var test=N;
};
function set(N) {
   window.test=N;
};

ksa 02.11.2011 20:00

А это твой вариант...

var test=1;
var a=function go() {
   var test=2;
};
alert(test);
var b=function set() {
   window.test=3;
};
alert(test);


Разницу видишь?

ksa 02.11.2011 20:03

Всё это я к чему... К тому, что язык выполняет последовательность команд как "понимает" их он. А не так, как их понимаешь ты. :)

Jambo85 04.11.2011 16:01

Спасибо за помощь, только разница в том что
var a=function go() {
var test=2;
};

В примере не выполняется пока ее не вызовешь, а в моем случае
img.onload = function(){
desc = true;
}

onload выполнит действие desc=true.
Вообщем так и не понял как в с помощью этой функции изменять значения переменной, видимо onload/onerror выполняются в каком то отдельном контексте.

ksa 04.11.2011 17:21

Цитата:

Сообщение от Jambo85 (Сообщение 134471)
в моем случае
img.onload = function(){
desc = true;
}

onload выполнит действие desc=true

В твоём примере она не выполняется. Именно это я и пытался тебе проиллюстрировать своим примером, который ты понял таки правильно.
А вот свой так и не понял... Показываю еще раз, т.с. максимально приблизив к боевым.

var desc; 
 var img = new Image();
 img.onload = function(){
    //var desc = true; 
    alert(1)
 }
 img.onerror = function(){
    //var desc = false; 
    alert(2)
 }
 img.src = 'http://javascript.ru/forum/images/smilies/smile.gif'; 
 ///alert(desc);


Хотя нет. :) Не прав тут я...
Тогда вот тебе нужный вариант.

window.desc=0; 
 var img = new Image();
 img.onload = function(){
    window.desc = true; 
 }
 img.onerror = function(){
    window.desc = false; 
 }
 img.src = 'http://javascript.ru/forum/images/smilies/smile.gif'; 
 setTimeout(function(){alert(window.desc);},200);


Т.е. onload не выполняется мгновенно... Ему ведь нужно дождаться когда картинка загрузится. Только тогда и наступает это событие.

Jambo85 05.11.2011 08:01

Во спасибо, как раз то что было нужно:)

Kolyaj 05.11.2011 09:21

Цитата:

Сообщение от ksa
setTimeout(function(){alert(window.desc);},200);

Откуда уверенность, что картинка за 200 мс успеет загрузиться?


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