|  | 
 
 
 楼主|
发表于 2008-12-20 15:35:47
|
显示全部楼层 
| 如何使用引擎 
 JS引擎一般作为共享库使用,应用程序调用引擎提供的API函数。引擎API函数大致分为以下几种:数据类型操作、RunTime控制、类与对象的创建和维护、函数与脚本执行、字符串操作、错误处理、安全控制、Debug支持。一般情况下,在你的应用程序中只需使用某几类函数。例如,在进行JS调用之前你必须调用JS_NewRuntime函数来创建并初始化JS引擎。有些类型的函数,象安全控制类,提供可选择的特征。
 从概念上讲,JS引擎是你系统上的一个共享资源。通过将引擎API调用嵌入到应用程序中(包含jsapi.h文件),你可以请求JS引擎进行操作。接下来,引擎处理你的请求,并将结果或状态信息返回给你的应用程序。
 例如,假定你在使用JS引擎自动化应用程序,脚本应用程序鉴别用户并设置权限。首先,应用程序创建JS对象,该对象描述用户信息,包括姓名、ID、权限和可用的函数列表。在这种情况下,应用程序首先调用JS_NewObject创建对象。当JS引擎创建对象后,返回一个指针给应用程序。应用程序再调用JS引擎执行脚本。在创建用户对象后,应用程序即刻传递脚本给JS_EvaluateScript以便编译和运行。脚本或许取得并效验用户信息,然后建立用户存取的权利。
 JS引擎收到初始化请求后,给JSRunTime分配内存,应用程序使用的变量、对象和上下文(上下文)都保存在RunTime中。一个上下文是脚本的执行状态(JS引擎使用的)。每个同时存在的脚本或线程都必须有自己的上下文。单个的JSRunTime可以包含多个上下文、对象和变量。几乎所有的JS引擎调用都需要一个上下文变量,应用程序在创建RunTime后,首先应调用至少一次JS_NewContext来创建一个上下文。上下文的实际数量依赖于程序中同时使用的脚本数。程序中每个同时存在的脚本都需要一个上下文。另一方面,如果某个时刻只有一个脚本编译和运行,那么你只需一个上下文给每个脚本重复使用即可。
 在创建上下文后,要调用JS_InitStandardClasses初始化引擎中的内置JS对象,包括Array、Boolean、Date、Math、Number和String。即使在创建对象时传递一个特定的上下文给JS引擎,这个对象在RunTime中也是独立于上下文。任意脚本能与任意上下文建立联系以便存取任意对象。脚本、上下文相互之间完全独立,即使它们存取同样的对象。在给定的RunTime中,应用程序能用未指定的上下文存取任意对象。你可以创建独立的RunTime,一个用于共享上下文和对象,其余的用于私有上下文和对象。但注意,某个时刻只有一个线程能存取特定的上下文。要让应用程序能识别JS,嵌入适当的引擎调用到你的程序中。大致有以下几个方面:
 
 要让应用程序能解释JavaScript,你必须遵循某些JSAPI嵌入习惯。下面的例子简要说明需要嵌入到你的应用程序中去的一些API调用函数。大部分情况下,这些函数的插入顺序是很重要的。例如,在调用其他JS API之前必须初始化JS RunTime,同样在终止程序之前必须释放JS RunTime。程序中包含jsapi.h。程序中提供结构和变量声明。例如,如果你计划传递一个脚本给JS引擎,提供一个脚本字符串变量。用jsapi.h中定义的JS数据类型来声明变量。使用JavaScript的脚本应用对象。通常这些对象与C程序中的结构和方法相对应。将JS引擎API函数调用和变量引用插入到程序中,包括初始化内置JS对象、创建并配置用户自定义对象。大多数JS引擎调用返回一个值。如果该值是NULL,一般表示错误发生。如果非NULL,表示成功,返回值一般是指针,程序需要使用或留到将来使用。应用程序应检查JS引擎调用的返回值。
 
 | #include <stdio.h> #include <stdlib.h>
 #include <string.h>
 /* 包含JS引擎的API头文件 */
 #include "jsapi.h"
 .
 .
 .
 //主程序声明全局JS变量,包括RunTime、一个Context和一个全局对象,然后初始化JS RunTime、创建一个Context。
 int main(int argc, char **argv)
 {
 int c, i;
 /*声明全局JS变量,包括全局和自定义对象*/
 JSVersion version;
 JSRuntime *rt;
 JSContext *cx;
 JSObject   *glob, *it;
 JSBool builtins;
 /* 初始化JS RunTime,返回结果给rt */
 rt = JS_NewRuntime(8L * 1024L * 1024L);
 /* 如果rt为空,程序终止 */
 if (!rt)
 return 1;
 /* 创建一个Context,并将其与JS RunTime关联起来 */
 cx = JS_NewContext(rt, 8192);
 /* 如果cx为空,程序终止 */
 if (cx == NULL)
 return 1;
 /* 创建全局对象 */
 glob = JS_NewObject(cx, clasp, NULL, NULL);
 /* 实例化内置对象和全局对象*/
 builtins = JS_InitStandardClasses(cx, glob);
 .
 .
 .
 return 0;
 }
 
 | 
 如上面这个例子所示,调用JS引擎的应用程序必须首先创建JSRunTime,而且在终止程序之前要释放这个RunTime。在实例化RunTime后,即可创建自己的JS对象模型。对象模型决定了JS对象之间的关系,JS对象本质上是一种层次结构。缺省情况下,所有的JS对象都与全局对象相关联,它们都是全局对象的后代。当初始化标准的JS类时,你自动地得到一个全局对象:
 builtins = JS_InitStandardClasses(cx, glob);
 这个全局对象创建了一些基本的、被其它对象所继承的性质和方法。当你创建自定义对象时,它们自动使用全局对象所定义的性质和方法。你可以在自定义对象上重新定义这些性质和方法,从而重载这些缺省的性质和方法。当然,你也可以接受这些缺省的分配。你可以在内置JS对象或其它自定义对象的基础上创建自己的对象。无论哪种情况,你所创建的对象都继承了层次链中父对象、一直上溯到全局对象的全部性质和方法。
 | 
 |