如何在 v8 Javascript 中的多个函数中使用相同的上下文?

2023-12-27

我是 V8 新手,尝试在 C++ 和 JS 代码之间创建一些绑定。问题是我无法跨不同的 Javascript 函数访问全局 Javascript 变量。原因是因为每个 Javascript 函数都调用了不同的 C++ 函数。我猜我的代码的问题是我在每个 C++ 函数中创建一个新的本地上下文。

我的JS代码:

var test = [];

function f1()
{
    var obj = {};
    obj.name = "Testing";
    test.push(obj);
}

function f2()
{
    var value = test[0].name;
}

我的 C++ 代码:

class Test 
{

  v8::Persistent<v8::Script> compiledScript;
  v8::Local<v8::Value> result;
  v8::Isolate* isolate;
  v8::Persistent<v8::Context> context;

  Test(filePath) {

      // Create and allocate isolate

      v8::Locker isolateLocker(isolate);
      v8::Isolate::Scope isolate_scope(isolate);
      v8::HandleScope handle_scope(isolate);
      // Create some bindings

      v8::Local<v8::Context> con = v8::Context::New(isolate, nullptr, binding_template);
      con->SetAlignedPointerInEmbedderData(0, &binder);

      context.Reset(isolate, con);
      v8::Context::Scope context_scope(con);

      std::string source_file = LoadFile(filePath);
      v8::Local<v8::String> sourceScript = v8::String::NewFromUtf8(isolate, source_file.c_str(), v8::NewStringType::kNormal).ToLocalChecked();
      v8::Local<v8::Script> script = v8::Script::Compile(con, sourceScript).ToLocalChecked();
      compiledScript.Reset(isolate, script);
}

void function1() 
{
    v8::Locker isolateLocker(isolate);
    v8::Isolate::Scope isolate_scope(isolate);               
    v8::HandleScope handle_scope(isolate);

    v8::Local<v8::Context> con= v8::Local<v8::Context>::New(isolate, context);
    v8::Local<v8::Script> script = v8::Local<v8::Script>::New(isolate, compiledScript);

    v8::Context::Scope context_scope(con);

    // Code to call the Javascript function f1

    result = script->Run(con).ToLocalChecked();
    v8::Local<v8::Object> global = con->Global();
    v8::Local<v8::Value> function_value1 = global->Get(v8::String::NewFromUtf8(isolate, "f1"));
    v8::Local<v8::Function> function1 = v8::Local<v8::Function>::Cast(function_value1);

    v8::Local<v8::Value> js_result1;

    js_result1 = function1->Call(con, global, 0, nullptr).ToLocalChecked();
}

void function2()
{
    v8::Locker isolateLocker(isolate);
    v8::Isolate::Scope isolate_scope(isolate);
    v8::HandleScope handle_scope(isolate);

    v8::Local<v8::Context> con = v8::Local<v8::Context>::New(isolate, context);
    v8::Local<v8::Script> script = v8::Local<v8::Script>::New(isolate, compiledScript);

    v8::Context::Scope context_scope(con);

    // Code to call the Javascript function f2

    result = script->Run(con).ToLocalChecked();
    v8::Local<v8::Object> global = con->Global();
    v8::Local<v8::Value> function_value2 = global->Get(v8::String::NewFromUtf8(isolate, "f2"));
    v8::Local<v8::Function> function2 = v8::Local<v8::Function>::Cast(function_value2);

    v8::Local<v8::Value> js_result2;

    js_result2 = function2->Call(con, global, 0, nullptr).ToLocalChecked();

 }
};
void main(int argcs, char* argvs[])
{
    V8::InitializeICUDefaultLocation(argvs[0]);
    V8::InitializeExternalStartupData(argvs[0]);
    Platform* platform = platform::CreateDefaultPlatform();
    V8::InitializePlatform(platform);
    V8::Initialize();

    Test test(jsFile);
    test.function1();
    test.function2();
}

当执行上面的 JS 代码时,我收到一个错误:name是未定义的属性。我的理解是变量test在第二个函数中无法识别,可能是因为每个函数都在不同的上下文中执行。如果是这样,我如何使它们在相同的上下文中执行?如果没有,有人可以帮助我理解并解决这个问题吗?

任何帮助将不胜感激 :)


我自己想通了。错误是我每次都在所有函数中运行脚本。相反,我应该在构造函数中只运行一次,就像编译一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 v8 Javascript 中的多个函数中使用相同的上下文? 的相关文章

  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 为什么我的 D3 SVG 图上的轴不会更新?

    I have 简单的 D3 散点图 http www raxacoricofallapatorius com test scattertest html我在显示数据的几个不同属性之间切换 但是虽然我可以更改数据点 并按照我想要的方式进行转换
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 此版本的 CLI 仅与 Angular 版本 5.0.0 或更高版本兼容错误

    我已经有 Angular 项目在 4 版本中运行 在安装新项目时 不幸的是我安装了 6 版本的 Angular cli 在以 4 版本运行的旧项目中运行 ngserve 命令时 这会引发错误 您的全局 Angular CLI 版本大于本地版
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 如何将项目插入到特定索引处的空数组中?

    我想将一个项目插入到空数组的指定索引中 我看到有 Array prototype splice 方法 但是 如果我在空数组上使用 splice 它只会添加项目来结束数组 如下所示 var a a splice 3 0 item 3 cons
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 根据文本内容从 jquery 对象中过滤元素

    我正在尝试使用contains带有 this 关键字 但它给出了错误 JS function var check ul find li filter function return this contains two css color r
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何使用 jQuery 过滤 DropDownList 中的选项

    我有 2 个 DropDownList 第一个 DropDownList 有 4 个选项 第二个 DropDownList 有 20 个选项 我想要一个选项value 1在第一个 DropDownList 中选择我在第二个 DropDown
  • Array.of 与“[ ]”。何时使用 Array.of 而不是“[ ]”?

    当我发现时我正在读一些书Array of https developer mozilla org en docs Web JavaScript Reference Global Objects Array of 根据 MDN Array o
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 使用
    元素作为 JavaScript 代码的输入。这是最好的方法吗?

    各位 显然 我是编码新手 所以最近完成了一些有关 HTML 和 Javascript 的 Lynda 课程后 我的简单 HTML 页面遇到了困难 基本上 我想要的是使用 JavaScript 进行基本计算 让用户使用 HTML 输入两个数字

随机推荐