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 в большинстве контекстов является undefined.Ключевое слово
thisподдерживается при связывании свойств из JavaScript. В выражениях привязки QML, обработчиках сигналов QML и объявленных функциях QMLthisссылается на объект области видимости. Во всех остальных ситуациях значениеthisв QML является undefined.Чтобы обратиться к конкретному объекту, укажите
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.12/qtqml-javascript-hostenvironment.html