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

Автор: Topol Среда, Май 2nd, 2012 Нет комментариев

Рубрика: Операционные системы

Когда мы впервые представили наши планы насчет 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 могут работать совместно для обеспечения большей совместимости и взаимодействия в интернете. Но все это становится возможным благодаря вышим отзывам. Так что пожалуйста держите нас в курсе.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты