Google V8编程详解(四)Context

上一章,比较略提了下V8的Context。本章将详细的讲解下Context的概念以及用法。

Context

Context是V8中一个非常重要的类,理解起来就一句话:JavaScript的执行环境。Context中包了JavaScript内建函数、对象等。所以,通过Context::New出来的Context都是一个全新的干净的JavaScript执行环境,切其他JavaScript环境的更改不影响New出来的Context的JavaScript执行环境,例如:修改JavaScript global函数。

注:使用了附录函数

Demo代码如下:

#include "v8.h"
#include "utils.h"

#include <iostream>

using namespace v8;
using namespace std;
void contextAFunc() {
	HandleScope handle_scope;
	Persistent<Context> contextA = Context::New();
	Context::Scope context_scope(contextA);
	Handle<v8::String> js = ReadJS("script.js");
	Handle<Script> script = Script::Compile(js);
	Handle<Value> result = script->Run();

	script = Script::Compile(String::New("var result = Math.min(5, 9);"));
	result = script->Run();
	printValue(result);
	contextA.Dispose();
}

void contextBFunc() {
	HandleScope handle_scope;
	Persistent<Context> contextB = Context::New();
	Context::Scope context_scopeB(contextB);

	Handle<Script> script = 
        Script::Compile(String::New("var result = Math.min(5, 9);"));
	Handle<Value> result = script->Run();
	printValue(result);
	contextB.Dispose();
}

int main(int argc, char** argv) {
	contextAFunc();
	contextBFunc();
	return 0;
}


script.js

Math.min = function(a, b) {return 1;}

var result = Math.min(5, 8);
Context之间的切换下图所示:

Google V8编程详解(四)Context


打印结果分别为:

1

5

可以看出,contextAFunc和contextBFunc分别位于不同的Context,在contextAFunc中对全局函数做了更改,所以第一次打印无论如何都是1,而contextBFunc中,New了一个contextB,整个js执行在contextB中,拥有一个全新的干净的JavaScript执行环境,所以,打印是5。


V8编程中,需要在不同的Context中进行切换,需要创建各种Context。这样会不会影响执行效率呢?V8已经考虑到这一点了,V8在除了创建第一个Context的时候,消耗的时间较长外,创建其他的Context的时候,开销非常小,V8对Context需要创建的一些JavaScript的内建对象即可。


Context常用函数讲解:

  static Persistent<Context> New(
      ExtensionConfiguration* extensions = NULL,
      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
      Handle<Value> global_object = Handle<Value>());

extensions 给新创建的Context创建扩展,一般都是NULL

global_template,这个参数比较有用,Context中的JavaScript的global对象是通过这个global_template创建的。当我们需要给JavaScript的global添加C++函数是,一般都是通过这个给这个global_template添加属性从而传递给JavaScript的global对象的。

golobal_object,其目的是是的global对象得到复用。可以是的不同的Context有相同的global对象。前提条件是必须使用相同的global_template。

  void Enter();
  void Exit();

用于不同的Context之间切换。


版权申明:
转载文章请注明原文出处,任何用于商业目的,请联系本人:hyman_tan@126.com



上一篇:API网关监控配置


下一篇:【错误记录】VMware 虚拟机报错 ( 虚拟化性能计数器需要至少一个可正常使用的计数器, 模块 “VPMC“ 启动失败 , 未能启动虚拟机 )