Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

[Temp] Как отзывы на привью платформы IE9 поменяли стандарт JavaScript

Напечатать страницу
04.08.2010 10:25 | mik2000

Когда мы впервые представили наши планы насчет Internet Explorer мы говорили что "разработчики и люди интересующиеся в стандартах и веб-разработчики могут испытать новую платформу и дать ранний отзыв". Сейчас мы получаем многочисленные отзывы на ежедневной основе и используем их для улучшения IE9. Однако, иногда влияние отзывов расширяется за пределы IE9. Вот история как недавний отзыв привел к корректировке нового стандарта JavaScript - ECMAScript 5th Edition (ES5).

ES5 стандарт был официально представлен в декабре 2009 года и третья часть привью IE9 впервые получило широкое распространение по внедрению некоторых тонких деталей спецификации ES5. Стандарт ES5 был разработан для высокой совместимости с существующими веб-сайтами и международный технический комитет европейской ассоциации производителей ЭВМ TC39 старался предотвратить любые не безопасные связи способные привести к изменениям, которые могут испортить существующий код JavaScript. Однако, ничего безупречного не существует в мире программ так будет интересно узнать о любых проблемах совместимости ES5 с существующими сайтами.
Скоро после опубликования этой платформы, мы получили отчет что некоторые веб-приложения которые используют jQuery корректно не работают в предварительном просмотре. Мы отследили эту проблему в особенностях jQuery API method которая в некоторых случаях пропускает вызывающую программу к значению Object.prototype.toString без первичной проверки, если значение ноль или неопределенно. Особенно, некоторые вызовы к jQuery method:

isFunction: function( obj ) {
return toString.call(obj) === "[object Function]";
},

выдает ошибку: "TypeError: Object expected". Последующий анализ показал что toString в вышеизложенном коде является встроенным методом Object.prototpe.toString и что сбой происходит когда isFunction был вызван с неизвестным значением как его аргумент. Почему ошибка случается в IE9 но не в предыдущих версиях или других браузерах? Потому что третья часть платформы IE9 в стандартном методе фактически подчиняется спецификации ES5 Object.prototype.toString.

В соответствии с предыдущими версиями спецификации ECMAScript, вызов любого встроенного метода используя значение ноль или неопределенно как текущего значения "глобальный объекта" (в браузерах это объект DOM window) метода такое и есть текущее значение. Это открывает ряд потенциальных брешей в безопасности, которые нацелены на уменьшение безопасности.

Спецификация ES5 изменяет ситуацию, так ноль или неопределенно не заменяется объектом window и определение каждого встроенного метода было обновлено в особенности если имеем дело с возвращением значения как текущего. Технический комитет ECMAScript попробовал сделать это при условии совместимости нормального использования и риска ситуации когда это невозможно. Object.prototype.toString был описан в ES5 исключения таких ситуаций. Это создает совместимость проблем описанных выше.

Эта проблема может быть легко скорректирована изменением кода jQuery с добавлением в код:

isFunction: function( obj ) {
return obj && toString.call(obj) === "[object Function]";
},

Разработчики jQuery собирались сделать данное изменение. Однако, такое изменение не исправит тысячи локальных копий jQuery которые уже существуют в интернете. Учитывая широкое распространение jQuery ясно, что ES5 включает значительное количество схожих проблем. Это очевидно, что мы можем изменить исполнение ES5 в IE9 для решения проблемы. Мы можем вернуть такое же строковое значение ("[object Object]") что и в IE8. Таких решение не принесет каких-либо проблем в безопасность ES5, которые стараются исключить. Однако, мы не хотим в одностороннем порядке внести такое изменение в реализацию нового стандарта. Это не решит проблемы совместимости или взаимодействия если в IE эта проблема будет решения один способом а в других браузерах другим или вообще не решена.

Как только мы поняли проблему и ее решение, я озвучил ее на TC39 при обсуждении обратной совместимости адресных списков. Мой первый пост по поводу данной проблемы был размещен в 17.51 25 июня в пятницу. К 22.00 был получен ответ от TC39. Мы все согласны что данная проблема относится к проблемам совместимости которая требует решения и в данном случае не решение этой проблемы будет нежелательным. Мы также первоначально согласились с тем что идея о возврате такого же строкового значения что и в ES3 в данном случае является хорошей идеей. Однако, в дальнейших сообщения после выходных мы поняли что не все браузеры могут вернуть "[object Object]" в данной ситуации, некоторые другие значения включая "[object Window]" и "[object Global]".Предлагалась возвращать "[object null]" и "[object undefined]". Показалось что это лучшее решение поскольку оно не только решает проблему с jQuery но также четко различает null и undefined от фактических объектах. Также это лучшим образом скажется на взаимодействии браузеров так как требуется чтобы браузеры выдавали идентичные результаты а не в ситуации с ES3 когда различные браузеры выдают различные результаты.

Ко Вторнику консенсус по поводу адресного списка последовал из окончательное предложения. Как только согласие было достигнуто я отдал на проверку Object.prototype.toString нашей группе разработчиков IE9 JavaScript так что они могли создать исправление во время к выходы следующего превью IE9. Разработчики Mozilla также проинформировали что они внедрят это исправление в следующую версию Firefox. Я также внес имения в ошибку в ES5 так как описано в данной статье (параграф 15.2.4.2).

Веб-стандарты являются комплексным программным обеспечением и как все программы, они содержат ошибки. Иногда лучший способ найти и исправить ошибку это применить определенный стандарт для широкого круга пользователей. Обычно такое бывает в случае раннего обнаружения как в случае с превью IE9. Так, когда вы как разработчик веб-страниц составляете отзывы та такие релизы вы не только предоставляете отзыв на определенный браузер вы также предоставляете отзыв на новый и внедряющийся стандарт. Конечно, такой отзыв необходим, разработчикам браузеров и стандартов необходимо иметь возможность быстро реагировать на отзывы в которых найдены существенные проблемы. Быстрая ответная реакция на проблемы с ES5 jQuery toString и другие проблемы с es5 - показывает как разработчики браузеров и другие члены TC39 могут работать совместно для обеспечения большей совместимости и взаимодействия в интернете. Но все это становится возможным благодаря вышим отзывам. Так что пожалуйста держите нас в курсе.


Источник: http://blogs.msdn.com/b/ie/archive/2010/07/16/how-ie9-platform-preview-feedback-changed-the-javascript-standard.aspx
Перевод: mik2000

Комментарии

Комментариев нет...
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 0.188 секунд (Общее время SQL: 0.169 секунд - SQL запросов: 53 - Среднее время SQL: 0.00319 секунд))
Top.Mail.Ru