Google V8编程详解(四)Context

Google V8编程详解(四)Context

标签: v8
  151人阅读  评论(0)  收藏  举报
  分类:

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

Context

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

注:使用了附录函数

Demo代码如下:

 

  1. #include "v8.h"  
  2. #include "utils.h"  
  3.   
  4. #include <iostream>  
  5.   
  6. using namespace v8;  
  7. using namespace std;  
  8. void contextAFunc() {  
  9.     HandleScope handle_scope;  
  10.     Persistent<Context> contextA = Context::New();  
  11.     Context::Scope context_scope(contextA);  
  12.     Handle<v8::String> js = ReadJS("script.js");  
  13.     Handle<Script> script = Script::Compile(js);  
  14.     Handle<Value> result = script->Run();  
  15.   
  16.     script = Script::Compile(String::New("var result = Math.min(5, 9);"));  
  17.     result = script->Run();  
  18.     printValue(result);  
  19.     contextA.Dispose();  
  20. }  
  21.   
  22. void contextBFunc() {  
  23.     HandleScope handle_scope;  
  24.     Persistent<Context> contextB = Context::New();  
  25.     Context::Scope context_scopeB(contextB);  
  26.   
  27.     Handle<Script> script =   
  28.         Script::Compile(String::New("var result = Math.min(5, 9);"));  
  29.     Handle<Value> result = script->Run();  
  30.     printValue(result);  
  31.     contextB.Dispose();  
  32. }  
  33.   
  34. int main(int argc, char** argv) {  
  35.     contextAFunc();  
  36.     contextBFunc();  
  37.     return 0;  
  38. }  

 

 

script.js

  1. Math.min = function(a, b) {return 1;}  
  2.   
  3. var result = Math.min(5, 8);  

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常用函数讲解:

 

  1. static Persistent<Context> New(  
  2.     ExtensionConfiguration* extensions = NULL,  
  3.     Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),  
  4.     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。

 

  1. void Enter();  
  2. void Exit();  


用于不同的Context之间切换。

 

 

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

来自 http://www.cnblogs.com/MingZznet/p/3231102.html

0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值