Handle,句柄
V8里有两种句柄:
1. Local handles:本地句柄,本地句柄在栈上,并且当指定的析构函数被调用时删除。这些句柄的生存时间由句柄范围决定;句柄范围经常在一个函数的开始的时候被创建,函数结束的时候被删除。
类Local 产生的本地句柄同样可以被存储在父类Handle 声明的句柄里。
2. Persistent handles:持久句柄,持久句柄并不在栈上分配,并且只有你指定移除它们时才被删除。一个持久的句柄通过 Persistent::New 来创建,并且通过Persistent::Dispose 来销毁。
类 Persistent 产生的持久句柄同样可以被存储在父类 Handle 声明的句柄里。
Scope : 句柄范围
句柄范围就是一个句柄的容器,这样就不需要挨个删除句柄了!
Context: 执行环境
在V8中,context 就是一个JavaScript的执行环境。当你创建了一个 context 后,你可以进入和退出任意次。也可以从一个context进入到另一个context
再看hello world
#include using namespace v8; int main(int argc, char* argv[]) { // 创建一个句柄范围. HandleScope handle_scope; // 创建一个context,这是一个持久句柄. Persistent<Context> context = Context::New(); // 进入之前创建的context
Context::Scope context_scope(context); // 这是一个本地句柄. Handle<String> source = String::New("'Hello' + ', World!'"); // 这是一个本地句柄. Handle<Script> script = Script::Compile(source); // 这是一个本地句柄.
Handle<Value> result = script->Run(); // 持久句柄必须显示的删除
context.Dispose();
// 函数结束前,HandleScope会被析构,这个函数范围内的本地句柄也会跟着被删除 return 0; }