执行 JavaScript 代码
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
1、执行 JavaScript 代码片段
执行 JS 最简单的方式,是将脚本作为字符串交给引擎来解释执行,执行完成之后释放临时 的脚本对象等。SpiderMonkey 提供一个 JS_EvaluateScript 函数,原型如下:
JSBool JS_EvaluateScript(JSContext *cx, JSObject *obj,
const char *src, uintN length, const char *filename,
uintN lineno, jsval *rval);
使用这个函数,需要提供上下文,全局变量,字符串形式的脚本,脚本长度及返回值指针,脚本名和行号参数可以填空值(分别为 NULL 和 0)。如果函数返回 JS_TRUE,表示执行成功,执行结果存放在 rval 参数中,否则执行失败,rval 中的值为 undefined。我们可以具 体来看一个例子:
char *script = "(function(a, b){return a * b;})(15, 6);";
jsval rval;
status = JS_EvaluateScript(context, global, script, strlen(script)\ , NULL, 0, &rval);
if(status == JS_TRUE){
jsdouble d;
JS_ValueToNumber(context, rval, &d);
printf("eval result = %f\n", d);
}
执行结果为:
eval result = 90.000000
2、编译 JavaScript 代码
通常,我们可能会多次执行一段脚本,SpiderMonkey 可以将脚本编译成 JSScript 对象,然后可以供后续的多次调用。现在来看一个例子,使用 C 代码编译一个 JavaScript 脚本,然后运行这个脚本。
JSBool evalScriptFromFile(JSContext *cntext, const char *file){
JSScript *script;
JSString *jss;
JSBool status;
jsval value;
//get the global object
JSObject *global = JS_GetGlobalObject(context);
//compile the script for further using
script = JS_CompileFile(context, global, file);
if(script == NULL){
return JS_FALSE;
}
//execute it once
status = JS_ExecuteScript(context, global, script, &value);
jss = JS_ValueToString(context, value);
printf("eval script result is : %s\n", JS_GetStringBytes(jss));
//destory the script object
JS_DestroyScript(context, script);
return status;
}
这里传递给函数 evalScriptFromFile 的 JSContext*参数为外部创建好的 Context 对象,创建的方法参看上一节。
JSBool status = evalScriptFromFile(context, "jstest.js");
if(status == JS_FALSE){
fprintf(stderr, "error while evaluate the script\n");
}
假设我们将如下脚本内容保存进一个脚本 jstest.js:
var Person = function(name){
var _name_ = name;
this.getName = function(){
return _name_; }
this.setName = function(newname){
_name_ = newname;
}
}
var jack = new Person("jack");
jack.setName("john");
//最后一句将作为脚本的执行结果返回给C代码
jack.getName();
jack 对象的名字现在设置为了”john”,脚本的最后一条语句的值将作为脚本的返回值返回到 C 代码处,并打印出来: eval script result is : john
在线练习
{$ activeFileHint $}