全部产品
云市场
云游戏

JavaScript 引擎说明

更新时间:2020-09-22 19:37:06

语法

内置全局对象

globalThis

轻应用内置 globalThis 代表全局对象,等同于Function('return this')()

$ amp > console.log(Function('return this;')());
{assert:{_func:true},console:{format:{_func:true},log:{_func:true}},print:{_func:true},system:{versions:{_func:true},version:{_func:true},platform:{_func:true},nextTick:{_func:true},uptime:{_func:true},memory:{_func:true}},setTimeout:{_func:true},clearTimeout:{_func:true},setInterval:{_func:true},clearInterval:{_func:true},TIMER:{open:{_func:true},setTimeout:{_func:true},clearTimeout:{_func:true},setInterval:{_func:true},clearInterval:{_func:true},close:{_func:true}},process:{versions:{_func:true},version:{_func:true},platform:{_func:true},nextTick:{_func:true},uptime:{_func:true},memory:{_func:true}},Promise:{_func:true},__native:{FS:{issupport:{_func:true},read:{_func:true},write:{_func:true},delete:{_func:true}},KV:{setStorageSync:{_func:true},getStorageSync:{_func:true},removeStorageSync:{_func:true}},LPM:{autosleep:{_func:true},sleep:{_func:true}},WAKELOCK:{create:{_func:true},lock:{_func:true},timedlock:{_func:true},unlock:{_func:true},free:{_func:true}},crypto:{md5:{_func:true}},MQTT:{VERSION:"0.0.2",start:{_func:true},subscribe:{_func:true},unsubscribe:{_func:true},publish:{_func:true},close:{_func:true}},WIFI:{connect:{_func:true},getInfo:{_func:true},disconnect:{_func:true}},CELLULAR:{getInfo:{_func:true},getStatus:{_func:true}},UDP:{createSocket:{_func:true},bind:{_func:true},sendto:{_func:true},recvfrom:{_func:true},close:{_func:true}},TCP:{createSocket:{_func:true},send:{_func:true},recv:{_func:true},close:{_func:true}},HTTP:{request:{_func:true}},IOT:{device:{_func:true},postProps:{_func:true},onProps:{_func:true},postEvent:{_func:true},onService:{_func:true},onClose:{_func:true},close:{_func:true}},ADC:{open:{_func:true},read:{_func:true},close:{_func:true}},DAC:{open:{_func:true},getVol:{_func:true},setVol:{_func:true},close:{_func:true}},GPIO:{open:{_func:true},read:{_func:true},write:{_func:true},toggle:{_func:true},on:{_func:true},close:{_func:true}},I2C:{open:{_func:true},read:{_func:true},write:{_func:true},readReg:{_func:true},writeReg:{_func:true},close:{_func:true}},SPI:{open:{_func:true},read:{_func:true},write:{_func:true},close:{_func:true}},PWM:{open:{_func:true},close:{_func:true},getConfig:{_func:true},setConfig:{_func:true}},RTC:{open:{_func:true},close:{_func:true},getTime:{_func:true},setTime:{_func:true}},UART:{open:{_func:true},read:{_func:true},write:{_func:true},on:{_func:true},close:{_func:true}},WDG:{start:{_func:true},stop:{_func:true},feed:{_func:true}},Audio:{play:{_func:true},stop:{_func:true},pause:{_func:true},resume:{_func:true},volume:{_func:true},setGain:{_func:true},getGain:{_func:true},mute:{_func:true}},TTS:{play:{_func:true},stop:{_func:true},volume:{_func:true},pitch:{_func:true},speed:{_func:true}}},App:{_func:true},cnt:0}

appConfig

appConfig用于获取app.json的内容,返回的Object类型。通过appConfig可以用来查看app.json的内容是否正确。

$ amp > console.log(appConfig);
{io:{"rgbled.r":{type:"GPIO",port:31,dir:0,pull:1},"rgbled.g":{type:"GPIO",port:32,dir:0,pull:1},"rgbled.b":{type:"GPIO",port:33,dir:0,pull:1}},debugLevel:"WARN"}

不可修改的全局对象

为了减少RAM占用率,AIoT轻应用默认把JS引擎的内置全局对象都存储在ROM中,相应的,部分全局对象默认无法更改。通过如下方法可以判断全局对象是否可更改:

Object.isExtensible(Math);
// false
Object.isExtensible(globalThis);
// true

require() 引入文件或模块

轻应用支持使用require()引入js文件或者模块。

通过当前路径引入js文件

目录结构:

.
├── app.js
├── app.json
├── utils.js
├── index.js
└── utils
    └── utils.js

当前目录文件引入:

var utils = require('./utils.js');
// 支持不带后缀
var utils = require('./utils');

子目录文件引入:

var utils = require('./utils/utils.js');

不指定文件名称时,默认引入index.js

var index = require('./');

node_modules 中引入js文件

未指定路径时,默认从node_modules中引入js文件。目录结构:

.
├── app.js
├── app.json
└─── node_modules
    └── utils.js
var utils = require('utils.js');

引入模块

轻应用规定,模块均放置在node_modules中,并且一定要有package.json文件,js文件默认为index.js。目录结构:

.
├── app.js
├── app.json
└─── node_modules
    └── time
        ├── package.json
        └── index.js
var time = require('time');

也可以在package.json文件中,指定模块的入口文件:

{
  "main": "./src/time.js"
}

目录结构:

.
├── app.js
├── app.json
└─── node_modules
    └── time            # time 模块
        ├── src
        │   └── time.js
        └── package.json

Date() 时间与日期

轻应用默认通过热更新通道,从阿里云物联网平台上获取NTP时间,当热更新服务可用时,就会自动校准时间。

# 系统启动时,热更新服务还未连接
$ amp > new Date();
1970-01-01 00:00:11.000+00:00
# 热更新服务连接后
$ amp > new Date()
2020-06-18 11:26:06.101+08:00

Promise

内置 Promise对象,相关示例:

function testSetInterval() {
    return new Promise(function (resolve, reject) {
        var count = 0;
        console.log('new Promise: setInterval');
        var timeHandler = setInterval(function () {
            console.log('interval: ', count);
            if(count++ >= 3){
                console.log('setInterval done');
                clearInterval(timeHandler);
                resolve("");
            }
        }, 1000);
    });
}

function testSetTimeout() {
    return new Promise(function (resolve, reject) {
        console.log('new Promise: setTimeout');
        setTimeout(function () {
            console.log('setTimeout done');
            resolve("");
        }, 1000);
    });
}

testSetTimeout().then(function(){
    testSetInterval().then(function(){
    });
});

EventEmitter

内置 EventEmitter对象,相关示例:

var event = require('events');
// console.log(event)

var instance = new event.EventEmitter();

instance.on('data', function(arg, arg2) {
    console.log('instance event: ', 'arg1: ' +arg, ', arg2: ' + arg2);
})

setInterval(function() { 
    instance.emit('data', 'this is instance data', 'data 2'); 
}, 1000);

error事件

如果没有为 'error' 事件注册监听器,则当 'error' 事件触发时,会抛出错误、打印堆栈跟踪。

Error: unhandled error
    at [anon] (events:1) strict
    at [anon] (./app.js:74) preventsyield

参考资料