[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: функция определяется внутри условия
inpost
Вступление: написал человек функцию, работает в ИЕ, в других браузерах не работает. Написал я функцию, работает ВЕЗДЕ, кроме ИЕ. Стал вопрос совместимостей, делаю банально:

if(navigator.userAgent.indexOf("MSIE") >= 0) {
alert("IE");
function a(var) {}
}

else {
alert("NOT IE");
function a(var) {}
}


В итоге эффект такой, что инициализируется функция и выполняется из ИЕ, когда этот браузер не ИЕ. В чём же дело, убираем вторую часть:
if(navigator.userAgent.indexOf("MSIE") >= 0) {
alert("IE");
function a(var) {}
}

Алерта не происходит, НО ФУНКЦИЯ ВЫПОЛНЯЕТСЯ.
Если банально убрать эту функцию из условия - всё, страница не работает как надо. Это говорит о том, что функция инициализируется внутри условия...

Так вопрос, это особенность JS, или как-то по другому это всё решается?

Что я сделал: создал 2 независимых функции a1 и a2, и при вызове функции a, сделал такой финт:
    function selectColor(id) {
var IE='\v'=='v';
if(navigator.userAgent.indexOf("MSIE") >= 0)
{
selectColor2(id);
}
else
{
selectColor3(id);
}
}


Проблема решена, но грусть осталась на душе, почему такая фигня происходит...



Спустя 15 часов, 34 минуты, 30 секунд (2.12.2011 - 11:43) KonstantinK написал(а):
Вероятно что JS сначала инициализирует все функции независимо от их расположение, а потом уже выполняет все действия в коде. Но проблема то решена , чего грустить? biggrin.gif

Спустя 24 минуты, 18 секунд (2.12.2011 - 12:08) redreem написал(а):
вот так надо было сделать:

if(navigator.userAgent.indexOf("MSIE") >= 0) {
alert("IE");
a = function (var) {}
}
else {
alert("NOT IE");
a = function (var) {}
}

Спустя 4 дня, 10 часов, 27 минут, 28 секунд (6.12.2011 - 22:35) inpost написал(а):
redreem
Спасибо! То, что надо.

Спустя 18 минут, 4 секунды (6.12.2011 - 22:53) vital написал(а):
Дело в том, как работает Js.
Она инициализирует ВСЕ переменные функции на этапе парсинга. Есть такой момент как "поднятие" переменных. Все переменные объявляются внутри текущей области видимости сраху, независимо от того, где они объявлены изначально в коде. ПРимерно так:

if (1==1){
alert(a);
}
var a = 'А я не объявлен в алерте';

Обе ваши функции были созданы, а выполнилась последняя.

Спустя 55 секунд (6.12.2011 - 22:54) vital написал(а):
По вышенаписанной причине в Js считается хорошим тоном и правилом, объявлять все переменные в начале текущей области видимости(а с ними тоже не все просто)
т.е. правильно так;

function (){
var a;
if (1==1){
alert(a);
}
a = 'Теперь это не выскочит';
}

Спустя 25 минут, 59 секунд (6.12.2011 - 23:20) inpost написал(а):
Спасибо!

Спустя 4 минуты, 35 секунд (6.12.2011 - 23:25) vital написал(а):
Цитата (inpost)
Спасибо

Глядишь в эксперты возьмут wink.gif
Хотя бы по js-у)


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.