Spec-Zone.ru › Qt 5.14

Ядро JavaScript в среде QML

QML предоставляет среду JavaScript, адаптированную для написания приложений QML. Эта среда отличается от среды хоста, предоставляемой браузером или серверной средой JavaScript, такой как Node.js. Например, QML не предоставляет объект window или DOM API, как это обычно встречается в среде браузера.

Общие основы

Как и в средах JavaScript браузера или серверной стороны, среда выполнения QML реализует стандарт Спецификации языка ECMAScript. Это обеспечивает доступ ко всем встроенным типам и функциям, определённым в стандарте, таким как Object, Array и Math. Среда выполнения QML реализует 7-ю редакцию стандарта.

В документации QML встроенные элементы ECMAScript не документируются явно. Для получения дополнительной информации об их использовании, пожалуйста, обратитесь к стандарту ECMA-262 7-го издания или одному из многочисленных онлайн-справочников и обучающих материалов по JavaScript, таких как Справочник по JavaScript от W3Schools (раздел "Справочник по объектам JavaScript"). Многие сайты фокусируются на JavaScript в браузере, поэтому в некоторых случаях может потребоваться уточнить в спецификации, является ли определённая функция или объект частью стандартного ECMAScript или специфичной для браузерной среды. В случае со ссылкой W3Schools выше, раздел JavaScript Objects Reference обычно охватывает стандарт, в то время как разделы Browser Objects Reference и HTML DOM Objects Reference специфичны для браузера (и, следовательно, не применимы к QML).

Глобальный объект QML

Среда JavaScript QML реализует ряд объектов и функций хоста, как подробно описано в документации Глобального объекта QML.

Эти объекты и функции хоста всегда доступны, независимо от того, были ли импортированы какие-либо модули.

Объекты и функции JavaScript

Список объектов, функций и свойств JavaScript, поддерживаемых движком QML, можно найти в Списке объектов и функций JavaScript.

Обратите внимание, что QML вносит следующие изменения в родные объекты:

  • Функция arg() добавлена в прототип String.
  • В прототипы Date и Number добавлены функции преобразования, учитывающие локаль.

Кроме того, QML также расширяет поведение функции instanceof, чтобы разрешать проверку типов относительно типов QML. Это означает, что вы можете использовать её для проверки того, что переменная действительно имеет ожидаемый тип, например:

var v = something();
if (!v instanceof Item) {
    throw new TypeError("I need an Item type!");
}

...

Ограничения среды JavaScript

QML реализует следующие ограничения для кода JavaScript:

  • Код JavaScript, написанный в файле .qml не может изменять глобальный объект. Код JavaScript в файле .js может изменять глобальный объект, и эти изменения будут видны в файле .qml при импорте.

    В QML глобальный объект является постоянным - существующие свойства не могут быть изменены или удалены, и новые свойства создавать нельзя.

    Большинство программ JavaScript не намеренно изменяют глобальный объект. Однако автоматическое создание незаявленных переменных JavaScript является неявным изменением глобального объекта и запрещено в QML.

    Предполагая, что переменная a не существует в цепочке области видимости, следующий код является незаконным в QML:

    // Illegal modification of undeclared variable
    a = 1;
    for (var ii = 1; ii < 10; ++ii)
        a = a * ii;
    console.log("Result: " + a);

    Он может быть тривиально изменён на этот законный код.

    var a = 1;
    for (var ii = 1; ii < 10; ++ii)
        a = a * ii;
    console.log("Result: " + a);

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

  • Глобальный код выполняется в ограниченной области видимости.

    Во время запуска, если файл QML включает внешний файл JavaScript с кодом «global», он выполняется в области видимости, которая содержит только сам внешний файл и глобальный объект. То есть, он не будет иметь доступа к объектам и свойствам QML, к которым он обычно имел бы доступ.

    Разрешается глобальный код, который обращается только к локальным переменным скрипта. Это пример допустимого глобального кода.

    var colors = [ "red", "blue", "green", "orange", "purple" ];

    Глобальный код, который обращается к объектам QML, не будет работать правильно.

    // Invalid global code - the "rootObject" variable is undefined
    var initialPosition = { rootObject.x, rootObject.y }

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

  • Значение this в QML является неопределённым в большинстве контекстов.

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

    Чтобы обратиться к конкретному объекту, укажите id. Например:

    Item {
        width: 200; height: 100
        function mouseAreaClicked(area) {
            console.log("Clicked in area at: " + area.x + ", " + area.y);
        }
        // This will pass area to the function
        MouseArea {
            id: area
            y: 50; height: 50; width: 200
            onClicked: mouseAreaClicked(area)
        }
    }

См. такжеОбласть видимости и разрешение имён.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qtqml-javascript-hostenvironment.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API