JavaScript Host Environment(Qt5)

27 篇文章 0 订阅

JavaScript Host Environment

[最近在upgradeQt4->Qt5的时候遇到一些JS的问题, 这个文档很好地解释了其中的变化;]

http://qt-project.org/doc/qt-5/qtqml-javascript-hostenvironment.html 


QML提供了一个裁剪过的JavaScript Host Environment来开发QML应用; 这个环境和浏览器或者server端如Node.js所提供的host environment有所不同; e.g. QML没有像普通的浏览器环境中一样提供一个window object或者DOM API;


Common Base

就像浏览器或者server端的js环境, QML runtime实现了ECMAScript Language Specification标准; 这提供了由标准定义的所有的built-in的类型的接口, 比如Object, Array和Math; QML runtime实现了第5版的标准, 和浏览器通常的实现版本一样;

标准的ECMAScript built-ins没有显式地在QML文档中注明; 更多细节可参考ECMA-262 5th edition标准或网上许多的在线js教程, 比如W3Schools JavaScript Reference  --JavaScript Objects Reference section; 许多网站专注于浏览器中的js, 所以一些情况下下你可能要仔细检查spec, 以决定是否一个function或object是标准的ECMAScript, 还是特定于这个浏览器环境的; 

就W3Schools来说, JavaScript Objects Reference section包含了标准, 又有浏览器特定的Browser Objects Reference, HTML DOM Objects Reference sections(这些不适用于QML)


QML Global Object

QML JavaScript host environment实现了一定数量的host object和function, 参考QML Global Object

这些host object和function总是可用的, 不管是否有多少个module导入;


JavaScript Objects and Functions

QML引擎支持一系列的JavaScript object, function和property, 参考List of JavaScript Objects and Functions.

注意QML对本地对象做了如下修改:

- arg()函数被加到 String prototype(原型)中;

- Locale-aware(区域感知)转换function加入到 Date和 Number prototype中;


JavaScript Environment Restrictions

QML对JavaScript代码有如下限制:


- JavaScript代码不能修改 global object;

在QML中, global object是constant的 - 已存在的property不能被修改或删除, 而且不能创建新的property;

多数JavaScript程序并不想修改global obejct; 但JavaScript对于undeclared(未声明)的变量的自动创建, 是一种对global object隐式的修改, 这在QML中是被禁止的;

假设一个变量在scope chain(作用范围)里并不存在, 下面的QML代码是非法的:

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

稍微修改一下就成为合法代码:

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

任何对于global object试图修改的动作--不管隐式的还是显式的--都会引起exception(异常); 如果异常uncaught(未捕获), 会打印出一个warning, 其中包含了问题代码的行号;


- Global code在一个reduced(简化的)作用域内运行

在启动时, 如果一个QML文件包含了使用"global"代码的外部JavaScript文件, 它是在一个只包含外部文件本身和global object的作用域内执行的; 就是说, 它没法正常地访问QML object和 property; 

参考 Scope and Naming Resolutionhttp://qt-project.org/doc/qt-5/qtqml-documents-scope.html 

Global code对本地变量的access(访问)是允许的; 有效的global code的例子:

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

访问了QML object的Global code无法正常运行;

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

这个限制在QML environment还没完全建立起来的时候就存在; 要在environment设置完成之后运行代码, 参考 JavaScript in Application Startup Code http://qt-project.org/doc/qt-5/qtqml-javascript-expressions.html#javascript-in-application-startup-code 


- 在QML中的大多数context(上下文)中this指针的值一般是undefined

JavaScript中绑定property时支持this关键字; 在其他所有的情况下, QML中的this的值是undefined;

参考一个特定的object, 提供id:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Item {
     width: 200; height: 100
     function  mouseAreaClicked(area) {
         console.log( "Clicked in area at: "  + area.x +  ", "  + area.y);
     }
     // This will not work because this is undefined
     MouseArea {
         height: 50; width: 200
         onClicked: mouseAreaClicked( this )
     }
     // This will pass area2 to the function
     MouseArea {
         id: area2
         y: 50; height: 50; width: 200
         onClicked: mouseAreaClicked(area2)
     }
}

---JS Host Environ End---YCR

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值