duktape 闭包注册

我有一个 C++ 项目,正在使用 duktape JS 库。我需要在 JS 中注册一个全局函数,并将对象的指针保存为闭包数据,以便在调用函数时可以访问该指针。

我知道如何在 lua c api 中实现这一点:

lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &someFunction, 1);
lua_setglobal(L, "someFunction");

首先将指针作为闭包数据推送,然后是函数指针。我需要在 duktape api 中获得相同的功能。

你能给我展示一些关于闭包注册和访问它的代码吗?

点赞
用户3739210
用户3739210

没有直接类比于"C闭包"相关的值,但你可以通过其他方式实现类似的结果。

一种简单的方式是将该值作为函数实例的属性存储:

duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");

然后,在调用该函数时,按如下方式检索该值:

void *ptr;

duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "_ptr");
ptr = duk_get_pointer(ctx, -1);
duk_pop_2(ctx);  /* 弹出指针和函数 */

/* 准备使用 'ptr' */

如果你想限制从Ecmascript代码访问关联值的访问权限,可以使用内部字符串,例如"\xFF" "ptr"

2016-12-01 22:08:18
用户23999
用户23999

我遇到了类似的问题。经过一番搜索,我发现了一篇关于如何持久化对象的维基页面,这对我来说在保存函数(回调)引用以备后用方面非常有用。

2017-09-29 07:30:59