2014-11-18 23 views
5

Bir program oluşturmak için v8 motoru kullandım, JS kodlarını şu şekilde çalıştırabilir:v8'de REAL global nesne nasıl oluşturulur?

alert ('test'); // alert işlevi C++ 'da yaratıldı ve global v8 içeriğine ayarlandı. bu yüzden çalıştırılabilir. Window.name = 'aa'; // window nesnesi C++ ila v8 ortamından dışa aktarılır.

Ama böyle pencere nesnesine özelliğini ayarlarsanız: = 'aa'

window.name; Sonra

, ben onu ziyaret:

alert (isim); // --------> bu isim hatanın tanımlanmamasına neden oldu ...

Chrome'da, özellik, pencere özellik adı için herhangi bir dize ayarlayabilirsiniz. iyi çalışıyor.

Bunu nasıl uygulayabilirim? JS bağlamında pencere gerçek bir küresel gibi görünüyor.

Kodum:

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; 

cevap

-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);"); 

==== kadar kolay -_-!

+2

Lütfen kodunuzun ne yaptığını ve neden bu sorunu çözeceği konusunda daha fazla açıklama eklemek için gönderinizi düzenleye üzerinde düşünün. Çoğunlukla sadece kod içeren bir cevap (çalışsa bile) genellikle OP'nin problemlerini anlamasına yardımcı olmaz. – Reeno

0

Sadece "name" yerine "window.name" ile "alert" aramanız gerektiğini düşünüyorum.

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

"window.name" "pencere" nesnesinin bir özelliği "adı" anlamına gelir, ama sadece "ad" (yani bu durumda arayarak olsun nesnedir "Bu" objet malı adını demektir " context-> C++ kodunda Global(). Global nesneyi değil, global nesnenin bir özelliği olarak "pencere" ayarlayın.