QML中JavaScript环境限制
QML对JavaScript代码实施以下限制:
- 写入
.qml
文件中的JavaScript代码无法修改全局对象。.js文件中的JavaScript代码可以修改全局对象,并且导入时这些修改对.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文件,则会在仅包含外部文件本身和全局对象的作用域中执行该文件。也就是说,它将无法正常访问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) } }
另请参阅范围和命名解析。
英文官方地址:https://doc.qt.io/qt-5/qtqml-javascript-hostenvironment.html#javascript-environment-restrictions