2013-05-22 12 views
8

Eşzamansız bir Düğüm Eklentisi yazıyorum, ancak istemci JavaScript geri çağrısı olarak adlandırılan "After" işlevinde bir HandleScope kullanmam gerekip gerekmediğini anlamaya çalışıyorum. Yeni kapsamları olan ve olmayan örneklerle karşılaştım, ama hiçbir zaman neden açıklama yapmadım. İşte bir örnek:Eşzamansız Addon'da HandleScope'un doğru kullanımı

void asyncWorkAfter(uv_work_t* req) { 
    HandleScope scope; // <-- Do you need a new scope? 

    const int argc = 1; 
    Local<Value> foo = String::New("foo"); 
    Local<Value> argv[] = { foo }; 

    // assume I got my callback function out of req 
    callback->Call(Context::GetCurrent()->Global(), argc, argv); 

    callback.Dispose(); 

    // if i use a new HandleScope, what happens to argv when we go out of scope? 
    // Do i need to do something like a scope.Close() to copy argv to the parent scope? 
} 

Geri aramayı çağırdığınızda bir HandleScope'a ihtiyacınız var mı?
Yeni bir HandleScope kullanıyorsanız, örnekte argv'ye ne olur?

+1

Benim understaning Eğer HandleScope halk düzgün toplanmasına izin verir Yerel her kullandığınızda, ihtiyaç olmasıdır. –

cevap

1

String::New("foo") yığın şey tahsis ve bir tanıtıcı dönmek, bu nedenle bazı how ele bu tarafından başvurulan bellek boşaltmak gerekir. Bunları bir HandleScope v8'e eklerseniz, tüm referanslar sıfır olarak sayıldıktan sonra sizin için bunu yapar.

Yerel kolları bir yığın yapılır ve uygun yıkıcı çağrıldığında silinir. Bu tutamaçların kullanım ömrü, genellikle numaralı bir çağrının başlangıcında oluşturulan bir tutamaç kapsamıyla belirlenir. sap kapsamı silindiğinde, çöp toplayıcısı daha önce kolu kapsamında kulpları tarafından başvurulan bu nesneleri ayırması serbesttir, artık JavaScript veya diğer tutamaklar erişilebilir sağladı.

https://developers.google.com/v8/embed