Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> функция определяется внутри условия, странный эффект
inpost  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 23010
Пользователь №: 20039
На форуме: 15 лет, 4 месяца, 20 дней
Карма: 623




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

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).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса