![]() |
#1 |
Участник
|
axforum blogs: Кросбраузерный CRM. Первая боль...
Источник: http://axforum.info/forums/blog.php?b=390
============== Свершилось. Вчера мы начали тестирование доработок в альтернативных браузерах. Текущий проект появился уже после всех кросбраузерных инициатив Microsoft так что взяв в руку мануалы
К сожалению, не только лишь в функциях проявляется разница между браузерами. Весь код с первой попытке взлетел в богомерзком Google Chrome, а вот любимый мной Mozilla Firefox, в честь которого я назвал своего рыжего кота, нанес мне коварный удар по самым стандартам... Рассмотрим код, который корректно работает в Chrome и IE, однако отказывается работать в Firefox: X++: Rest = { Execute: function (onrest) { var message = "tada!"; onrest(message); } } Test = { OnLoad: function () { if (true == true) { Rest.Execute(OnRest); function OnRest(mes) { alert(mes); } } } } Test.OnLoad(); Кого-то может удивить, почему функция используется до своего объявления, однако это нормально. Так устроен JS (ECMAScript): область видимости функции конструируется до ее выполнения, поэтому достаточно объявить функцию или переменную и совершенно неважно когда она инициализируется - до или после объявления. В этом примере функция OnRest объявлена внутри функции OnLoad и присутствует в ее области видимости до момента вызова. В момент вызова первой строчки браузер знает где искать ее объявление. Проблема заключается в другом: стандарт требует чтобы функции не объявлялись внутри блоков. Иными словами, функция может объявляться внутри другой функции, но она не должна объявляться внутри циклов или оператора if. При этом важно понимать, что в JS область видимости функции или переменной задается не блоками операторных скобок { } а областью объявления самой функции. Например следующий пример вполне корректный: X++: if (true == true){ var i = 5;}alert(i); хотя и выглядит жутковато для человека привыкшего к С-подобным языкам. Как бы то ни было, разные браузеры смотрят на данный стандарт это по разному. Firefox не ищет объявление функций внутри управляющих блоков, поэтому функция оказывается неизвестна до своего объявления. Если убрать блок if то пример будет работать во всех трех браузерах одинаково: X++: Rest = { Execute: function (onrest) { var message = "tada!"; onrest(message); } } Test = { OnLoad: function () { Rest.Execute(OnRest); function OnRest(mes) { alert(mes); } } } Мораль: используя особенности языка, нужно четко понимать как они работают. Не объявляйте функции внутри управляющих блоков, а лучше до их использования. Источник: http://axforum.info/forums/blog.php?b=390
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
|