如何在v8中创建REAL全局对象?

时间:2014-11-18 02:34:23

标签: javascript google-chrome scope window v8

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

警报('测试&#39); // alert函数在C ++中创建,并设置为v8上下文。所以它可以运行。

window.name =' aa&#39 ;; // window对象从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;

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:-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);");

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

相关问题