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
最後更新:2017-04-02 00:06:51