【问题标题】:how to create REAL global object in v8?如何在 v8 中创建真正的全局对象?
【发布时间】:2015-01-15 03:05:21
【问题描述】:

我使用v8引擎创建了一个程序,它可以运行JS代码:

警报('测试'); // 警报函数在 C++ 中创建,并将全局设置为 v8 上下文。这样就可以运行了。

window.name = 'aa'; // 窗口对象从 C++ 导出到 v8 环境。

但是,如果我将属性设置为窗口对象,例如:

window.name ='aa';

然后,我去看看:

警报(名称); // --------> 这会导致名称未定义的错误...

在 Chrome 中,我们可以设置属性,任何字符串作为窗口属性名称。它运行良好。

那么我该如何实现呢?在 JS 上下文中,窗口似乎是真正的全局。

我的代码:

Isolate* isolate = Isolate::GetCurrent();
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);


Handle<ObjectTemplate> global = ObjectTemplate::New(isolate);

v8::Handle<v8::FunctionTemplate> log_ft = v8::FunctionTemplate::New(isolate, log_Callback);
log_ft->InstanceTemplate()->SetInternalFieldCount(1);
global->Set(isolate, "alert", log_ft);


Handle<Context> context = Context::New(isolate, NULL, global);
Context::Scope context_scope(context);


// set global objects and functions

Local<Object> obj( Object::New(isolate));
context->Global()->Set( String::NewFromUtf8(isolate, "window"), obj );



runJSCode(context, (char*)"window.name =33; alert(name);");

std::cout << "********* v8 executed finished !! ********** \n";
return 0;

【问题讨论】:

    标签: javascript google-chrome scope window v8


    【解决方案1】:

    我认为你需要用“window.name”而不是“name”来调用“alert”。

    runJSCode(context, (char*)"window.name =33; alert(window.name);");
    

    "window.name" 表示对象 "window" 的属性 "name",但仅 "name" 表示对象 "this" 的属性名称(在这种情况下,您通过调用 "context->Global 获得的对象()”在 C++ 代码中)。您将“窗口”设置为全局对象的属性而不是全局对象。

    【讨论】:

    • 我认为,这就是 OP 所要求的,如何在不参考 window.name 的情况下使 name 全局化。
    【解决方案2】:
    //Local<Object> obj( Object::New(isolate));
    //context->Global()->Set( String::NewFromUtf8(isolate, "window"), obj );
    
    runJSCode(context, (char*)"window=this; window.name =33; alert(name);");
    

    ==== 太容易了-_-!

    【讨论】:

    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多