Google V8編程詳解(四)Context

來源:互聯網
上載者:User

上一章,比較略提了下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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.