简体   繁体   English

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

[英]how to create REAL global object in v8?

I used v8 engine to create a program , it can run JS codes like :我使用 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.

But, if I set property to window object like :但是,如果我将属性设置为窗口对象,例如:

window.name ='aa';

then, I visit it :然后,我访问它:

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

In Chrome , we can set property , anything string for the window property name .在 Chrome 中,我们可以设置属性,任何字符串作为窗口属性名称。 it runs fine.它运行良好。

So how can I implement that ?那么我该如何实现呢? it seems that the window is real global in JS context.似乎该窗口在 JS 上下文中是真正的全局。

My code :我的代码:

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;

I think that you need to call "alert" with "window.name" instead of just "name".我认为你需要用“window.name”而不是“name”来调用“alert”。

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

"window.name" means a property "name" of object "window", but just "name" means property name of objet "this" (that is in this case the object you get by calling "context->Global()" in C++ code). “window.name”表示对象“window”的属性“name”,但仅“name”表示对象“this”的属性名称(在这种情况下,即通过调用“context->Global()”获得的对象在 C++ 代码中)。 You set "window" as a property of the global object not as global object.您将“窗口”设置为全局对象的属性,而不是全局对象。

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

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

==== so easy -_-! ==== 这么简单-_-!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM