duktape 关闭注册

duktape closure registration

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

我知道如何在 lua c api:

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

首先我将指针作为闭包数据推送,然后是指向函数的指针。我在 duktape api.

中需要相同的功能

你能给我一些关闭注册和访问的代码吗?

与 "C closure" 关联的值没有直接类比,但您可以通过其他方式获得类似的结果。

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

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);  /* pop pointer and function */

/* ready to use 'ptr' */

如果您想限制从 Ecmascript 代码访问关联值,您可以使用 internal string,例如"\xFF" "ptr".

我遇到了类似的问题。经过一番搜索后,我发现 a Wiki on howto persist objects 可以保存函数(回调)参考供以后使用。