VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 12652|回复: 0

[分享] SpiderMonkey_31.2.0版编程笔记 二___变量操作

[复制链接]
04_avatar_middle
online_vip 发表于 2015-9-15 14:49:56 | 显示全部楼层 |阅读模式
本帖最后由 liehuo 于 2015-9-15 21:41 编辑

在上个帖子里只是简单的介绍了一下流程,并没有涉及到对js数据的一些操作,这次我们就从最基本的变量开始示例。javascript里的变量我把它当中全局对象的一个属性。比如 var num=123,你就可以把他当做是window对象的一个属性。你可以向这样访问它:window.num。不信你写个HTML代码里面用上JavaScript试试。但是在spidermonkey里并没有window对象,因为这不是浏览器。它里面的全局对象就是根化的全局对象global。你就把他当作是global对象的一个属性就可以。要获取某个变量的值有一个函数叫JS_GetProperty:
          bool JS_GetProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::MutableHandleValue vp)
从字面上就可以看出就是获取属性的值,反正我是这么认为的。相反,要设置一个变量的值也有一个api函数叫JS_SetProperty:
          bool JS_SetProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::HandleValue v)
好了,用到的只是就这么多,下面就开始根据上个帖子里的代码基础上进行示例:
  1. #include "stdafx.h"
  2. #include "include/jsapi.h"
  3. #pragma comment(lib,"lib/mozjs-31.lib")//这里直接用这种方式,是为了观看方便
  4. using namespace JS;
  5. static JSClass global_class = {
  6.         "global",
  7.         JSCLASS_GLOBAL_FLAGS,
  8.         JS_PropertyStub,          //增加属性
  9.         JS_DeletePropertyStub,    //删除属性
  10.         JS_PropertyStub,          //获取属性
  11.         JS_StrictPropertyStub,    //设置属性
  12.         JS_EnumerateStub,
  13.         JS_ResolveStub,
  14.         JS_ConvertStub
  15. };

  16. void ExecScript(JSContext *cx)
  17. {
  18.         JSObject *obj = JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook);//创建一个新的JavaScript对象用作一个全局对象,但是要被根化这里没有被根化
  19.         //RootedObject global(cx, JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook));//上面和下面的可以并作中间的这一句。分开写是为了循序渐进
  20.         RootedObject global(cx, obj);//在当前的上下文环境,用创建的全局对象创建根化的全局对象
  21.         JSAutoCompartment ac(cx, global);//进入新全局对象的隔室,好像干什么坏事总是见不得人,非要躲在包厢里做坏事一样
  22.         JS_InitStandardClasses(cx, global);//初始化全局对象和其它js里的常规对象

  23.         char* script = "var num=123";
  24.         const char *filename = "noname";
  25.         int lineno = 1;
  26.         bool ok = false;
  27.         ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno);//执行脚本
  28.         RootedValue rval(cx); //创建一个RootedValue变量用于接收执行的结果,而这个结果的值是一个要被根化的值
  29.         JS_GetProperty(cx, global, "num", &rval);//获取js里的变量的值,js里的变量被视为属性;
  30.         int num = JSVAL_TO_INT(rval);//将js里的整形变量转换为c++里的整形
  31.         printf("设置前num=%d\n", num);
  32.         RootedValue setVal(cx);//这里再创建一个根化变量用于设置js里的变量值
  33.         setVal.setInt32(99);
  34.         JS_SetProperty(cx, global, "num", setVal);//设置js里变量的值,你换个属性名试试,那就是添加一个属性,当然下面获取也要变为相应的属性名
  35.         JS_GetProperty(cx, global, "num", &rval);//再次调用函数获取js变量的值,看是否改变
  36.         num = JSVAL_TO_INT(rval);
  37.         printf("设置后num=%d\n", num);
  38.         printf("\n");
  39. }
  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42.         JS_Init();     //初始化JS引擎,一定要有这步,不然其它的操作都是扯淡
  43.         JSRuntime *rt = JS_NewRuntime(8L * 1024 * 1024, JS_USE_HELPER_THREADS);//创建运行时,是不是跟以前的不一样了
  44.         if (!rt)
  45.                 return 1;
  46.         JSContext *cx = JS_NewContext(rt, 8192);//创建一个JS上下文,与运行时关联起来
  47.         if (!cx)
  48.                 return 1;
  49.         //****************************************************************************************
  50.         ExecScript(cx);
  51.         //****************************************************************************************
  52.         JS_DestroyContext(cx);//销毁创建的上下文
  53.         JS_DestroyRuntime(rt);//销毁释放运行时
  54.         JS_ShutDown();        //释放js引擎使用的所有资源
  55.         return 0;
  56. }
复制代码
程序运行结果如图:
SpiderMonkey_31.2.0版编程笔记 二___变量操作
上一篇: SpiderMonkey_31.2.0版编程笔记 一
下一篇:SpiderMonkey_31.2.0版编程笔记 三___函数操作一






上一篇:SpiderMonkey_31.2.0版编程笔记 一
下一篇:SpiderMonkey_31.2.0版编程笔记 三___函数操作一
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 03:57

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表