v8 中 MaybeLocal<Value> 的意义何在?
What is the point of MaybeLocal<Value> in v8?
这里有人知道为什么 v8 API return MaybeLocal
中的许多函数处理而不是简单的 Local
类型吗?
我知道调用可能会失败,但是 Local
类型已经有一个 IsEmpty()
方法,无论如何都可以轻松查询,如果已经严格测试 Local
类型在使用它们之前是空的,只要它们被旧 API 中的任何 v8 API 函数 return 编辑,那么新 API 中的 MaybeLocal
似乎是不必要的多余的。除了坚持使用过时且不再受支持的 v8 版本 API,似乎别无选择,只能跳过使用 MaybeLocal
.
的障碍
我只是想知道它的基本原理是什么,特别是因为正如我所说,您已经可以测试 Local
以查看它是否为空,尤其是因为尝试将 MaybeLocal
为空 Local
将彻底崩溃应用程序。
尽管 Local<T>
和 MaybeLocal<T>
可能看起来相似,但它们的用途却截然不同。
当 API return 是 T
或抛出错误时,使用 MaybeLocal<T>
。特别是,不变量 try_catch.HasCaught() == maybe_result.IsEmpty()
应该成立。还有一个 Maybe<T>
类型用于 API,如 Object::Set
,它没有 return 一个 JavaScript 值,但仍可能抛出。
Local<T>
用于其他所有内容,基本上表示可为空的 T
引用。例如,Isolate::GetCurrentContext
可能 return 是一个空的 Local<Context>
,但这不是因为它抛出,而是空的,因为没有当前上下文。
这里有人知道为什么 v8 API return MaybeLocal
中的许多函数处理而不是简单的 Local
类型吗?
我知道调用可能会失败,但是 Local
类型已经有一个 IsEmpty()
方法,无论如何都可以轻松查询,如果已经严格测试 Local
类型在使用它们之前是空的,只要它们被旧 API 中的任何 v8 API 函数 return 编辑,那么新 API 中的 MaybeLocal
似乎是不必要的多余的。除了坚持使用过时且不再受支持的 v8 版本 API,似乎别无选择,只能跳过使用 MaybeLocal
.
我只是想知道它的基本原理是什么,特别是因为正如我所说,您已经可以测试 Local
以查看它是否为空,尤其是因为尝试将 MaybeLocal
为空 Local
将彻底崩溃应用程序。
尽管 Local<T>
和 MaybeLocal<T>
可能看起来相似,但它们的用途却截然不同。
T
或抛出错误时,使用 MaybeLocal<T>
。特别是,不变量 try_catch.HasCaught() == maybe_result.IsEmpty()
应该成立。还有一个 Maybe<T>
类型用于 API,如 Object::Set
,它没有 return 一个 JavaScript 值,但仍可能抛出。
Local<T>
用于其他所有内容,基本上表示可为空的 T
引用。例如,Isolate::GetCurrentContext
可能 return 是一个空的 Local<Context>
,但这不是因为它抛出,而是空的,因为没有当前上下文。