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之间的切换下图所示:

打印结果分别为:

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

时间: 2025-01-14 18:01:00

Google V8编程详解(四)Context的相关文章

Google V8编程详解附录

Google V8编程详工具函数 头文件:utils.h #ifndef UTILS_H_ #define UTILS_H_ #include "v8.h" #include <iostream> using namespace v8; using namespace std; v8::Handle<v8::String> ReadJS(const char* name); void printValue(Handle<Value> result);

Google V8编程详解(五)JS调用C++

最近由于忙着解决个人单身的问题,时隔这么久才更新第五章. 上一章主要讲了Google V8的Context概念.那么其实Google V8的基本概念还有FunctionTemplate, ObjectTemplate等比较重要的基本概念,这些概念将在后续章节中进行渗透. 本章主要来讲讲如何通过V8来实现JS调用C++.JS调用C++,分为JS调用C++函数(全局),和调用C++类. JS调用C++函数 JS调用C++函数,就是通过FunctionTemplate和ObjectTemplate进行

Google V8编程详解(三)Handle &amp;amp; HandleScope

上一章简单的演示了一个Helloworld Demo.里面涉及到了V8的一些基本类型和概念,本章将围绕这个Demo对V8的基本类型和相关概念进行讲解. 这里还是先把Demo贴出来便于后面分析: #include <v8.h> using namespace v8; int main(int argc, char* argv[]) { // Create a stack-allocated handle scope. HandleScope handle_scope; // Create a n

Google V8编程详解(序)Cloud App

         应用程序发展到今天,应用程序的概念也在不断地发生着变化,WiKi的解释是这样的:"应用程序指为完成某项或多项特定工作的计算机程序".这里所指的应用程序在软件行的今天,绝大多数指的是需要经过下载安装在本定机器上运行的程序,称之为本地应用.而目前国内很多IT公司都在部署自己的移动互联网战略,主推Cloud App云应用,如阿里云OS.百度云应用.Cloud App正在形成一种新的应用程序形式,即不需要安装即可使用的程序.体现了Cloud App热部署的特点,这也是JS的特

Google V8编程详解(二)HelloWorld

上一章讲到了V8的编译和安装,这一章开始从一个demo着手. 这里选用了官方文档的一个非常简洁的HelloWorld.cc,代码如下: #include <v8.h> using namespace v8; int main(int argc, char* argv[]) { // Create a stack-allocated handle scope. HandleScope handle_scope; // Create a new context. Persistent<Con

Google V8编程详解(一)V8的编译安装(Ubuntu)

V8的编译比较简单,需要同时安装git和svn. 下载V8源码: git clone git://github.com/v8/v8.git v8 && cd v8 切换到最新版本: git pull --rebase origin master 安装依赖: make dependencies 编译: make native mode=debug library=shared snapshot=on 编译后库文件会在v8/out/ia32.release路径下 V8的Makefile不支持m

linux多线程编程详解教程

 这篇文章主要介绍了linux多线程编程详解教程,提供线程通过信号量实现通信的代码,大家参考使用吧 线程分类   线程按照其调度者可以分为用户级线程和核心级线程两种.   (1)用户级线程  用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程

IOS中Json解析实例方法详解(四种方法)_IOS

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)  [顶]ORACLE PL/SQL编程详解之二:   PL/SQL块结构和组成元素(为山九仞,岂一日之功)     继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不