我一直在使用SpiderMonkey C API,并希望使用他们的API在C中实现闭包。我想要实现的是相当复杂的,但我甚至无法弄清楚如何做一个简单的如:
function x() {
var i = 0;
return function() { i++; print(i); };
}
var y = x();
y(); //1
y(); //2
y(); //3
我想知道是否有人知道我该怎么做。我找到了JS_NewFunction方法,但我实际上并不知道这是否是朝着正确方向迈出的一步。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
我不知道是否有纯粹的C方式做闭包。如果可以的话,我会建议你只需在javascript中实现所需的功能,并简单地评估JSAPI中的javascript文本。从那里,使用JSAPI来获取实现主机功能所需的任何句柄/变量。使用JSAPI做javascripty事情真是太麻烦了,如果可以的话就避免它。
答案 1 :(得分:0)
叙述好像你可能仍然感兴趣,一年后。
在JS_GetParent的文档中疯狂地编织我的眉毛,我看到了
对于某些函数,它用于实现词法作用域(但这是一个实现细节)。
然后,以及创建函数的API函数列表
其中一些函数允许应用程序指定父对象。如果创建对象的JSAPI函数具有父参数,并且应用程序向其传递非空值,则该对象将成为新对象的父对象。否则,如果上下文正在运行任何脚本或函数,则会根据这些对象选择默认父对象。
我稍后可能会对此进行实验,但似乎您可以通过(仅)在执行您希望它具有范围的函数期间在API中创建函数来执行此操作。
否则,您可以使用JS_SetParent手动将函数的词法范围设置为某个对象,但文档仍然不正当地使用父级“内部”。
</necro>