从概念上理解,作用域可以看成是一个句柄的容器,在一个作用域里面可以有很多很多个句柄(也就是说,一个 scope 里面可以包含很多很多个 v8 引擎相关的对象),句柄指向的对象是可以一个一个单独地释放的,但是很多时候(真正开始写业务代码的时候),一个一个地释放句柄过于 繁琐,取而代之的是,可以释放一个 scope,那么包含在这个 scope 中的所有 handle 就都会被统一释放掉了。
Scope 在 v8.h 中有这么几个:HandleScope,Context::Scope。
HandleScope 是用来管理 Handle 的,而 Context::Scope 仅仅用来管理 Context 对象。
代码像下面这样:
// 在此函数中的 Handle 都会被 handleScope 管理HandleScope handleScope;// 创建一个 js 执行环境 ContextHandle context = Context::New(); Context::ScopecontextScope(context);// 其它代码
一般情况下,函数的开始部分都放一个 HandleScope,这样此函数中的 Handle 就不需要再理会释放资源了。 而 Context::Scope 仅仅做了:在构造中调用 context->Enter(),而在析构函数中调用 context->Leave()。
网友评论