AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Blogs
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2013, 13:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,644 / 848 (80) +++++++
Регистрация: 28.10.2006
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, напишите личное сообщение администратору.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 13 Blog bot Dynamics CRM: Blogs 0 27.03.2013 22:12
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 12 Blog bot Dynamics CRM: Blogs 0 30.01.2013 01:11
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 10 Blog bot Dynamics CRM: Blogs 0 17.08.2012 03:27
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 4 Blog bot Dynamics CRM: Blogs 0 24.09.2011 01:16
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:39.