Google V8编程详解(四)Context
http://blog.csdn.net/feiyinzilgd/article/details/8266780
上一章,比较略提了下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之间的切换下图所示:

打印结果分别为:
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
Google V8编程详解(四)Context的更多相关文章
- Google V8编程详解附录
Google V8编程详工具函数 头文件:utils.h #ifndef UTILS_H_ #define UTILS_H_ #include "v8.h" #include &l ...
- Google V8编程详解(五)JS调用C++
http://blog.csdn.net/feiyinzilgd/article/details/8453230 最近由于忙着解决个人单身的问题,时隔这么久才更新第五章. 上一章主要讲了Google ...
- Google V8编程详解(三)Handle & HandleScope
上一章简单的演示了一个Helloworld Demo.里面涉及到了V8的一些基本类型和概念,本章将围绕这个Demo对V8的基本类型和相关概念进行讲解. 这里还是先把Demo贴出来便于后面分析: #in ...
- Google V8编程详解(序)Cloud App
此系列文章转载于此http://blog.csdn.net/feiyinzilgd/article/details/8247723 应用程序发展到今天,应用程序的概念也在不断地发生着 ...
- Google V8编程详解(二)HelloWorld
转自http://blog.csdn.net/feiyinzilgd/article/details/8248448 上一章讲到了V8的编译和安装,这一章开始从一个demo着手. 这里选用了官方文档的 ...
- Google V8编程详解(一)V8的编译安装(Ubuntu)
V8的编译比较简单,需要同时安装git和svn. 下载V8源码: git clone git://github.com/v8/v8.git v8 && cd v8 切换到最新版本: g ...
- Linux 网络编程详解四(流协议与粘包)
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
随机推荐
- bzoj3316: JC loves Mkk
Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...
- 简单的聊天室代码php+swoole
php swoole+websocket 客户端代码 <!DOCTYPE html> <html> <head> <title></title&g ...
- [LeetCode] 8. String to Integer (atoi)
Implement atoi to convert a string to an integer. public class Solution { public int myAtoi(String s ...
- scala环境配置
scala下载 解压 vim ~/.profile export PATH=~/dev/scala/scala-/bin:$PATH idea的scala插件这个由于太大,只能手工下载,注意下载的版本 ...
- 循环写入Insert 与 SqlBulkcopy
/* Insert by Loop */ cmd.CommandText = "insert into BizSharedStore (BizSharedStoreId,BizSharedI ...
- Sql Server分割字符串函数
-- Description: 分割字符串函数 -- SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',') -- ========================= ...
- boost timer 定时器 Operation cancel !
前面段时间处理一个定时器时,老是提示 操作取消. 硬是没搞明白为什么! 其实我遇到的这个情况很简单就是(boost::asio::deadline_timer timer)这个变量的生命同期结束了,对 ...
- 爬虫之scrapy框架
解析 Scrapy解释 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓 ...
- [DFNews] Cellebrite UFED系列更新, 支持IOS7
10月15日,Cellebrite公司对旗下产品进行了更新,包括UFED Classic.UFED Touch.Physical Analyzer.Logical Analyzer.Phone Det ...
- Microsoft Visual Studio has encountered a problem
VS 2010 断点调试的时候,一运行到断点就报这个错误"Visual Studio has encountered a problem and needs to close", ...