基本代码模板
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
1、基本流程 使用 SpiderMonkey,一般来讲会使用以下流程:
- 创建运行时环境
- 创建一个/多个上下文对象
- 初始化全局对象
- 执行脚本,处理结果
- 释放引擎资源
在下一小节详细说明每个流程
2、代码模板 使用 SpiderMonkey,有部分代码是几乎每个应用程序都会使用的,比如错误报告,初始 化运行时环境,上下文,全局变量,实例化全局变量等操作。这里是一个典型的模板:
#include "jsapi.h"
引入 jsapi.h,声明引擎中的所用到的记号,结构体,函数签名等,这是使用 SpiderMonkey所需的唯一一个接口文件(当然,jsapi.h 中不可能定义所有的接口,这些文件在 jsapi.h 头部引入 jsapi.h,如果对 C 语言的接口,头文件引入方式不熟悉的读者,请参阅相关资料)。
/* 全局变量的类声明 */
static JSClass global_class = {
"global",
JSCLASS_GLOBAL_FLAGS,
JS_PropertyStub,
JS_PropertyStub,
JS_PropertyStub,
JS_PropertyStub,
JS_EnumerateStub,
JS_ResolveStub,
JS_ConvertStub,
JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS
};
JSClass 是一个较为重要的数据结构,定义了 JavaScript 对象的基本结构---“类”,这个 类可以通过 SpiderMonkey 引擎来实例化为对象。JS_PropertyStub 是 JS_PropertyOp 类型的变量,这里的 JS_PropertyStub 是为了提供一个默认值。JS_PropertyOp 可以用 做对象的 setter/getter 等的,这些内容我们将在后边的章节详细讨论。
/* 错误处理函数,用于回调,打印详细信息 */
void report_error(JSContext *cx, const char *message, JSErrorReport *report){
fprintf(stderr, "%s:%u:%s\n",
report->filename ? report->filename : "<no filename>",
(unsigned int) report->lineno, message);
}
定义好这些结构之后,我们需要实例化这些结构,使之成为内存对象,流程如下:
int main(int argc, char *argv[]){
JSRuntime *runtime;
JSContext *context;
JSObject *global;
//创建新的运行时8M
runtime = JS_NewRuntime(8L * 1024L * 1024L);
if(runtime == NULL){
return -1;
}
//创建新的上下文
context = JS_NewContext(runtime, 8*1024);
if(context == NULL){
return -1;
}
//
JS_SetOptions(context, JSOPTION_VAROBJFIX);
//设置错误回调函数, report_error函数定义如上
JS_SetErrorReporter(context, report_error);
//创建一个新的JavaScript对象
global = JS_NewObject(context, &global_class, NULL, NULL);
if (global == NULL){
return -1;
}
//实例化global,加入对象,数组等支持
if (!JS_InitStandardClasses(context, global)){
return -1;
}
//
//使用global, context等来完成其他操作,用户定制代码由此开始
//
//释放上下文对象
JS_DestroyContext(context);
//释放运行时环境
JS_DestroyRuntime(runtime);
//停止JS虚拟机
JS_ShutDown();
return 0;
}
用户自己的代码从上边代码中部注释部分开始,用户代码可以使用此处的 context 对象及预设过一定属性,方法的 global 对象。
在线练习
{$ activeFileHint $}