【发布时间】: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