javascript - 如何将 std::function 绑定(bind)到 JavaScript V8?

标签 javascript c++ binding v8 std-function

我刚开始使用 JavaScript V8并从 Embedder's Guide 编译了一个基本示例.现在我想将 C++ 函数绑定(bind)到 JavaScript 上下文。

现在我只有一个或多或少的空白类,稍后应该处理绑定(bind)。

class Manager
{
public:
    Manager()
    {
        context = Context::New();
    }
    void Bind(string Name, function<Handle<Value>(const Arguments&)> Function)
    {
        // bind the function to the given context
    }
private:
    Persistent<Context> context;
};

如何将 std::function 对象绑定(bind)到 JavaScript V8 上下文?

最佳答案

我在我的引擎中使用的是一种相当复杂的方法,但这是我首先想到的。 (遗憾的是,我从 V8 转移到 LLVM,因此我没有对此进行优化。)

void ExposeFunctions(v8::Handle<v8::ObjectTemplate> engine) {
    /* ... */
    engine->Set(v8::String::New("Exit"), v8::FunctionTemplate::New(NativeExit));
    engine->Set(v8::String::New("Log"), v8::FunctionTemplate::New(NativeLog));
    /* ... */
}

int SpawnEngine() {
    v8::Locker locker;
    v8::HandleScope handleScope;
    v8::TryCatch exceptionManager;
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
    ExposeFunctions(global);
    v8::Persistent<v8::Context> context = v8::Context::New(nullptr, global);
    v8::Context::Scope scope(context);
    /* ... */
    context.Dispose();
    return 0;
}

这应该至少为您提供了一个将 native 函数绑定(bind)到解释器的可能解决方案,您可以根据需要对其进行修改。

考虑到您使用函数对象的问题,可以尝试(只是猜测)像我对命名函数所做的那样直接传递它,或者将它嵌套在传递给 v8::FunctionTemplate::New 的 lambda 表达式中.但是我已经有一段时间没有使用它了。

关于javascript - 如何将 std::function 绑定(bind)到 JavaScript V8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15731699/

相关文章:

wpf - 将画笔颜色绑定(bind)到 ControlTemplate 中的属性

java - 使用 Jackson 转换器将嵌套的 json 绑定(bind)到 @RequestBody 对象

android - 如何用 View 绑定(bind)替换 findViewById(v.getId()) ?

javascript - 如何在无限滚动页面上重复运行 Chrome 扩展代码

javascript - React - 如何渲染变量中包含的 HTML?

c++ - 如何以编程方式判断两个变量是否位于同一个堆栈上? (在 Windows 中)

c++ - SDL_RWread 返回带有段错误的字符串

C++ 段错误,为什么使用 "long long"我没有得到答案?

javascript - 什么是 promise 对象?

用 n*n 替换每个 nn 的 JavaScript 正则表达式