【问题标题】:How to Implement Closures Using SpiderMonkey API?如何使用 SpiderMonkey API 实现闭包?
【发布时间】:2009-02-09 04:14:24
【问题描述】:

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

【问题讨论】:

    标签: javascript c spidermonkey


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      看到JS_GetParent 的文档,我怒不可遏,我明白了

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

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

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

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

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

      </necro>
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 2016-04-04
        • 2021-10-15
        • 2018-05-23
        • 1970-01-01
        • 2018-08-12
        • 2011-02-17
        • 1970-01-01
        • 2017-02-01
        相关资源
        最近更新 更多