даже в его неряшливом и строгом состоянии

Это великое чудо, как JavaScript не смог успешно прорвать Интернет - не совсем так. Нет никаких сомнений в том, что ужасные истории все еще витают в великой темной паутине некачественного кодирования, но, по общему мнению, обновления языка не вызвали так много серьезных проблем.

Что ж, большинство проблем, возможно, куплено Internet Explorer - но это совершенно отдельный вопрос. Explorer всегда был «лишним», когда дело касалось поддержки JavaScript.

Итак, вопрос в том, как JavaScript удается поддерживать такую ​​стабильность, независимо от выпусков за последние 20 лет? Несмотря на все сторонние взгляды и насмешливые замечания со стороны других, более «подходящих» языков программирования, как получается, что технология, выпущенная еще в 1995 году, все еще выдерживает темп?

Изящное искусство версионирования

Идея управления версиями заключается в том, что с каждым основным выпуском устаревшие функции либо обновляются, либо удаляются из языка, фреймворка или библиотеки. Это означает, что новый код не будет работать в старых реализациях.

Код, написанный из версии 2, никогда не будет работать для чего-то, что работает в версии 1. Управление версиями часто является подходом, когда язык выполняет серьезное обновление. Для многих это подход типа «все или ничего», когда код мгновенно ломается, если появляется что-то из другой версии.

Альтернативой этому подходу является система тегов, в которой вы можете разрешить существование нескольких версий на одной базе кода. С помощью JavaScript вы можете вручную объявить через Content-Type

Например, следующее объявление скажет программе применить определенную версию ECMAScript.

Content-Type: application/ecmascript;version=6

Хотя во многих случаях это не является обязательной необходимостью, использование объявления Content-Type может пригодиться для таких вещей, как Explorer. Итак, мы говорим о JavaScript с незапамятных времен до версии 6.

Альтернативой этому является внутриполосный подход, который объявляет, какая версия конкретно применяется к коду. Для этого вы можете использовать use, запустив файл со следующей строки:

use version 6;

Проблема с этим подходом заключается в том, что каждый раз, когда вы объявляете другую версию, база кода разветвляется, и движку необходимо поддерживать каждую версию параллельно. В результате движок может раздуться, поскольку он пытается реализовать различную семантику и поддерживать ее параллельную работу. Код также становится труднее рефакторингом, потому что вам нужно будет учитывать версии.

Уходи! Откажитесь от управления версиями

JavaScript имеет встроенную обратную совместимость, которая не позволяет нам вносить изменения или унаследованный код, который может выйти из строя при выпуске новых версий. Это часть надежности и защиты JavaScript от взлома Интернета в целом.

В результате управление версиями больше не является требованием, особенно для новых движков. Однако устаревшие движки и компиляторы старше 10 лет могут по-прежнему нуждаться в объявлениях управления версиями. Это предотвращает разделение JavaScript на разные версии и режимы.

Старый код можно будет использовать независимо от выпуска.

Однако у JavaScript есть два режима - строгий и небрежный - для работы с такими вещами, как let, который является производным и улучшением var, но var не полностью прекращен, поскольку он по-прежнему имеет свое место как в старом, так и в новом коде.

Проблема с let, например, в том, что изначально это не было зарезервированным ключевым словом, а это означает, что разработчики могли использовать их в качестве имен переменных. Это может вызвать некоторую путаницу, особенно если ваш синтаксис выглядит примерно так:

let = "Tibbers";

В приведенном выше примере let на самом деле является типизированным экземпляром var. Я знаю, что это странно, но такие вещи случаются.

Войдите в строгий режим

Строгий режим появился в версии 5 (выпущенной в 2009 г.) и работает над устранением устаревших проблем, вызванных незарезервированными ключевыми словами, используемыми разработчиками до его выпуска.

Это вызовет сбой кода при использовании ранее допустимых синтаксисов. Зарезервированные ключевые слова реализованы строго и вызовут ошибки возврата, если они используются неправильно в контексте версии 5 и выше.

Эти зарезервированные идентификаторы: implements inteface package let private protected public yield static

Присвоение необъявленным переменным вызовет ReferenceError. Напротив, когда создаются необъявленные переменные, для их размещения автоматически создается глобальная переменная.

В строгом режиме свойства, доступные только для чтения, также становятся принудительными и выдают TypeError. При нестрогой реализации свойства только для чтения существуют только на поверхности и в значении синтаксиса. Технически вы все еще можете изменить его, что может вызвать несколько нежелательных побочных эффектов и потенциально нарушить чистоту вашего кода.

Проблема со строгим режимом заключается в том, что, хотя он очищает ваш JavaScript и обеспечивает более высокий уровень эффективности кода на основе обновленной версии, обслуживание существующей кодовой базы для обеспечения соответствия - другое дело.

Хотя идея строгого режима хороша для создания ясности и фокусировки, при одновременном устранении прошлых проблем, связанных с наследием, процесс обновления, особенно для более крупных кодовых баз, может быть довольно проблематичным.

Заключительные слова

ECMAScript 6 полностью обратно совместим. Поэтому, даже если вы случайно добавили старые идеи в код JavaScript, он не сломается, если вы не используете строгий режим.

Также хорошо отметить, что ECMAScript является стандартом. Это означает, что то, как его реализуют движки и компиляторы, - это другая сущность. Это связано с тем, что браузеры и компании, стоящие за движками и компиляторами, могут интерпретировать стандарт по-разному, например, как Microsoft всегда получает другой вариант JavaScript, несмотря на реализацию JavaScript.

Разработчики и движки выигрывают от отсутствия форков и управления версиями, поскольку это снижает общую нагрузку на процесс кодирования и реализации.

Хотя различие между строгим и нестрогим режимом сродни управлению версиями, но по-своему, оно менее громоздко, чем попытки поддерживать каждую версию в дополнение к ней. Это особенно важно, поскольку с 2015 года ECMAScript перешел на ежегодные выпуски, а в последнее время - на 6-месячные циклы.

Подробнее о версиях ECMAScript вы можете прочитать здесь.

Спасибо за чтение.

Афинья