gpt4 book ai didi

javascript - 如何在 v8 中创建真正的全局对象?

转载 作者:搜寻专家 更新时间:2023-11-01 04:43:35 24 4
gpt4 key购买 nike

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

alert('test');  // alert function is created in C++ and set global to v8 context. so it can be run.

window.name = 'aa'; // window object is exported from C++ to v8 enviroment.

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

window.name ='aa';

然后,我访问它:

alert(name); // --------> this caused error that name is undefined...

在 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;

最佳答案

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

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

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

关于javascript - 如何在 v8 中创建真正的全局对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com