1

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

我知道如何在 lua c api 中做到这一点:

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

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

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

4

2 回答 2

1

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

/* ready to use 'ptr' */

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

于 2016-12-01T22:08:18.510 回答
0

我有一个类似的问题。经过一番搜索,我找到了一个关于如何持久化对象的 Wiki,它对我有用,可以保存函数(回调)引用以供以后使用。

于 2017-09-29T07:30:59.247 回答