Поделиться через


Обновление приложений, созданных в предыдущих версиях JScript

Основная часть существующего кода JScript будет работать при использовании усовершенствованных функций, включенных в JScript 10.0, так как JScript 10.0 имеет почти полную обратную совместимость со своими предыдущими версиями. Новые функции в JScript 10.0 относятся к новым областям применения данного языка.

По умолчанию программы JScript 10.0 компилируются в быстром режиме. Поскольку быстрый режим накладывает некоторые ограничения на допустимые типы кода, программы могут быть более эффективными и выполняться быстрее. Однако некоторые функции, доступные в предыдущих версиях, в быстром режиме недоступны. В большинстве случаев эти функции были несовместимы с многопоточными приложениями и снижали эффективность кода. Для программ, скомпилированных с помощью компилятора с интерфейсом командной строки, можно обеспечить полную обратную совместимость, отключив быстрый режим. Обратите внимание на то, что код, скомпилированный таким образом, выполняется медленнее и более восприимчив к ошибкам. Быстрый режим нельзя отключить в приложениях ASP.NET, так как это приведет к появлению нестабильности. Дополнительные сведения см. в разделе /fast.

Быстрый режим

В быстром режиме активируются следующие правила JScript:

  • Необходимо объявить все переменные.

  • Функции становятся константами.

  • Встроенные объекты не могут иметь свойства "expando".

  • Свойства встроенных объектов не могут быть перечислены или изменены.

  • Объект "arguments" недоступен.

  • Нельзя выполнять назначение переменной, полю или методу, доступным только для чтения.

  • Метод "eval" не может задавать идентификаторы во внешней области видимости.

Необходимо объявить все переменные

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

В быстром режиме требуются явные объявления переменных. Это позволяет избежать указанных выше ошибок и ускорить выполнение кода.

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

Дополнительные сведения см. в разделе Переменные и константы в JScript.

Функции становятся константами

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

В быстром режиме функции становятся константами. Следовательно для функций нельзя назначать новые значения или изменять уже назначенные значения. Это позволяет предотвратить изменение значения функции.

Если скрипт требует изменения функции, можно явно задать переменную для хранения экземпляра объекта Function. Однако следует помнить о том, что обработка объектов Function выполняется медленно. Дополнительные сведения см. в разделе Объект "Function".

Встроенные объекты не могут иметь свойства "expando"

В предыдущих версиях JScript к встроенным объектам можно было добавить свойства "expando". Это можно было использовать для добавления метода в объект String, например, для удаления начальных пробелов в строке.

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

Единственным важным исключением из данного правила является объект Global, который может иметь свойства "expando". Все идентификаторы в глобальной области видимости в действительности являются свойствами объекта Global. Очевидно, что для поддержки добавления новых глобальных переменных объект Global должен быть динамически расширяемым.

Свойства встроенных объектов не могут быть перечислены или изменены

В предыдущих версиях JScript предварительно заданные свойства встроенных объектов можно было удалить, кроме того, можно было перечислить их и выполнить в них запись. Это можно было использовать, например, для изменения метода по умолчанию toString объекта Date.

В быстром режиме это запрещено. Данная функция больше не нужна, поскольку встроенные объекты не могут иметь свойств "expando", а свойства для каждого объекта перечислены в разделе ссылок. Дополнительные сведения см. в разделе Объекты.

Объект "arguments" недоступен

В предыдущих версиях JScript в объявлениях функций присутствовал объект arguments, который позволял функциям принимать произвольное число аргументов. Объект "arguments" также содержал ссылку как на текущую функцию, так и на вызывающую функцию.

В быстром режиме объект arguments недоступен. Однако в JScript 10.0 объявления функций могут задавать массив параметров в списке параметров функции. Это позволяет функции принимать произвольное число аргументов, что частично выполняет задачи объекта arguments. Дополнительные сведения см. в разделе Оператор function.

В быстром режиме способа для непосредственного доступа к текущей или вызывающей функции или задания ссылки на такую функцию не существует.

Нельзя выполнять назначение переменной, полю или методу, доступным только для чтения

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

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

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

Метод "eval" не может задавать идентификаторы во внешней области видимости

В предыдущих версиях JScript функции и переменные могли быть заданы в локальной или глобальной области видимости с помощью вызова метода eval.

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

При отключении быстрого режима снова начинает использоваться предыдущий режим работы метода eval.

См. также

Ссылки

/fast

Основные понятия

Введение в JScript 10.0 для программистов на JScript

Другие ресурсы

Приступая к работе с JScript