句柄是Chrome V8一个重要的概念,提供了对于堆内存中JavaScript数据对象的一个引用。

    • 本地句柄【v8:local】

    存在于栈内存中,对应析构函数调用的时候被删除,其生命周期由所在的【句柄作用域(Handle Scope)】决定
    【句柄栈不是C++调用栈的子集,但是句柄作用域对象式,并且句柄作用域只能栈内存分配,也就是说不能用new创建一个句柄作用域】
    API: 1. 创建(New), 2消除(Clear) 3是否为空(isEmpty) 4 转换类型(As/Cast)

    1. // v8::Number类型的静态方法,传入一个Isolate示例及c++ double乐性的数据,chrome v8创建一个js的number数据
    2. // 返回一个指向内存引用该数据的本地句柄
    3. Local<Number> Number::New(ISolate* isolate, double value);
    4. Local<Number> handle = Number::New(isolate, 233);
    5. handle.clear();
    6. handle.IsEmpty()
    7. // as式成员属性,cast静态函数,本地句柄转换为其他类型的本地句柄
    8. Local<Number> ret1= Local<Number>::Cast(handle);
    9. Local<Number> ret2 = handle.As<Number>();
    • 持久句柄【v8:Persistent, 构建函数中传入一个本地句柄,句柄基类PersistentBase

    提供了一个堆内存中声明的js对象的引用。

    1. Chrome中的Dom节点们在chrome v8中就是以持久句柄形式存在,不局限于某个函数的作用域总。
    2. 一个js对象的引用只剩下一个弱持久句柄时,chrome会除非一个回调,

    【唯一持久句柄(v8::UniquePersistent<…>)和一般持久句柄(v8::Persistent<…>)】
    唯一持久句柄使用c++的构建函数和析构函数管理底层对象的生命周期
    一般持久句柄使用构建函数来持久,必须调用persistent::Reset来进行显式的清除

    1. 构造函数

      1. Local<Number> local = Number::New(isolate, 2333);
      2. Persistent<Number> persistent_handle(isolate, local);
    2. 清除【Clear】与是否为空【isEmpty】

    ···

    1. 置为弱持久句柄 ```cpp // 函数原型? template void Persistent::SetWeak(P *parameter, WeakCallbackInfo

      ::Callback callback, WeakCallbackType type);

    parameter: 可以式任意数据类型<br />callback: 【当js对象引用只剩下一个弱持久句柄,v8垃圾回收就会触发回调函数, 参数parameter】<br />type: 回调函数类型,枚举<br />3.1 kParmeter: WeakCallbackInfo::GetParameter()获取传入的数据<br />3.2 kInternalFields: 使用该值,回调WeakCallBackInfo::GetInternalField(int index)获取传入数据,关于InternalField的内容回在后续介绍
    
    4. 取消弱持久句柄
    ```cpp
    persistent_handle.ClearWeak();  // 取消后变成一般的持久句柄
    
    1. 标记独立句柄

    5.1 chrome v8的垃圾回收器可以自由的忽略包含该句柄的对象组
    5.2 独立的持久句柄在新生代回收的时候被回收,而非独立句柄不行。通俗点说独立持久句柄的生命周期更短

    persistent_handle.SetWeak(test,  Callback, WeakCallbackType::kParameter);
    persistent_handle.MarkIndependent();
    
    1. 是否未弱的IsWeak与是否为独立的IsIndependent
      bool weak = persistent_handle.IsWeak();
      bool independent = persisten_handle.IsIndependent();
      
    • 永生句柄【v8:Eternal】

      整个程序的生命周期不会被删除,开销更小,不会被垃圾回收,也通常不用到。

    • 待实本地句柄

    在以往可能返回空句柄的接口,现在都以待实本地举办的形式代替返回值。

    MybeLocal<String> s = x.ToString();
    Local<String> _s = s.ToLocalChecked();
    
    • 其他句柄

    句柄存在的形式是C++的一个模板类,其需要根据不同的ChromeV8 数据类型进行不同的声明

    • v8::Local: 本地js数值类型句柄
    • v8::Persistent:持久js字符串类型句柄