我有C ++项目,我正在使用duktape JS库。我需要在JS中注册全局函数并使用此函数将对象的指针保存为闭包数据,因此我可以在调用函数时访问此指针。
我知道如何在lua c api中执行此操作:
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &someFunction, 1);
lua_setglobal(L, "someFunction");
首先我将指针作为闭包数据,然后指向函数。我在duktape api中需要相同的功能。
你能告诉我一些关闭注册并访问它的代码吗?
答案 0 :(得分:1)
与“C闭包”相关的值没有直接比喻,但您可以通过其他方式获得类似的结果。
一种简单的方法是将值存储为函数实例的属性:
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' */
然后,在调用函数时,将值检索为:
"\xFF" "ptr"
如果您想限制从Ecmascript代码访问相关值,您可以使用internal string,例如$.ajax({
type: 'GET',
url: 'someUrl.php',
data: {op : "demo"},
dataType: 'json',
success: function(data){
$("#restaurantList > td").empty();
$.each(data, function(i,result){
var buttons = $('<button/>', { id: 1, text:"Get Rating", value: "GetRating", click: function(){alert(result.business);}});
var newRow =
"<tr>"
+"<td>" + result.business + "</td>"
+"<td>" + result.address + "</td>"
+"<td>" + result.rating + "</td>"
+"<td>" + result.date + "</td>"
+"</tr>"
$("#restaurantList tbody").append(newRow)
$("#restaurantList tbody").append(buttons)
});
}
});
。
答案 1 :(得分:0)
我有类似的问题。经过一些搜索,我发现a Wiki on howto persist objects对我有用,可以保存一个函数(回调)参考供以后使用。