1

我一直在使用 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 方法,但我实际上不知道这是否是朝着正确方向迈出的一步。任何帮助将不胜感激,谢谢!

4

2 回答 2

0

我不知道是否有一种纯 C 方法来进行闭包。不过,如果可以的话,我建议您只在 javascript 中实现您需要的功能,并在 JSAPI 中简单地评估 javascript 文本。从那里,使用 JSAPI 获取实现主机功能所需的任何句柄/变量。使用 JSAPI 做 javascripty 的事情真的很麻烦,如果可以的话,尽量避免。

于 2009-02-09T05:41:27.647 回答
0

叙述好像你可能仍然感兴趣,一年后。

我在JS_GetParent的文档中疯狂地皱起眉头,我明白了

对于某些函数,它用于实现词法作用域(但这是一个实现细节)。

然后,连同创建函数的 API 函数列表,

其中一些函数允许应用程序指定父对象。如果创建对象的 JSAPI 函数有一个 parent 参数,并且应用程序将一个非空值传递给它,那么该对象将成为新对象的父级。否则,如果上下文正在运行任何脚本或函数,则会根据这些选择默认父对象。

我稍后可能会对此进行试验,但似乎您可以通过(仅)在执行您希望它具有范围的函数期间在 API 中创建函数来做到这一点。

否则,您可能可以使用JS_SetParent手动将函数的词法范围设置为某个对象,但文档一直不祥地称这种使用父级“内部”。

</necro>
于 2010-10-13T20:03:37.593 回答