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 сначала инициализирует все функции независимо от их расположение, а потом уже выполняет все действия в коде. Но проблема то решена , чего грустить?
Спустя 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) |
Спасибо |
Глядишь в эксперты возьмут
Хотя бы по js-у)
_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).