JavascriptCore:
在 C++ 代码中与 JavaScript 代码进行交互的第一步是能Javascript中基本类型
- JSStringRef <-> JSStringCreateWithUTF8CString <->
- JSValueRef <-> JSValueMakeNumber <-> JSValueToNumber
- Boolean
- JSObjectRef <-> JSObjectMake <-> JSObjectSetProperty JSObjectGetProperty
Javascript代码内部可能会有交互,例如代码内部可能调用许多函数,例如代码依赖/影响一些全局变量:因此我们在执行与JavaScript相关的操作时都需要指明JavaScript 执行上下文JSContextRef
- JSContextRef
- JSGlobalContextRef
过程中可能需要执行代码
-
执行Javascript代码 JSEvaluateScript
-
还是不方便,JSObjectCallAsFunction
V8:
const char* script1 = "var i = 0;";
const char* script2 =
"function a() {"
" i++;"
"}";
// 执行完后环境中有了i这个变量,初始为0
JSStringRef scriptString1 = JSStringCreateWithUTF8CString(script1);
JSEvaluateScript(context, scriptString1, nullptr, nullptr, 0, &exception);
// 执行完后环境中有了a这个函数
JSStringRef scriptString2 = JSStringCreateWithUTF8CString(script2);
JSEvaluateScript(context, scriptString2, nullptr, nullptr, 0, &exception);
// 获取变量 i
JSStringRef iName = JSStringCreateWithUTF8CString("i");
JSValueRef iValue = JSObjectGetProperty(context,JSContextGetGlobalObject(context), iName, nullptr);
// 获取函数 a
JSStringRef aName = JSStringCreateWithUTF8CString("a");
JSValueRef aValue =JSObjectGetProperty(context,JSContextGetGlobalObject(context),aName, nullptr);
JSObjectRef aFunction = JSValueToObject(context, aValue, nullptr);
// 测试,结果是3
for (int j = 0; j < 3; ++j) {
JSObjectCallAsFunction(context, aFunction, nullptr, 0, nullptr, nullptr);
}
JSValueToNumber(context, iValue, nullptr)
JSEvaluateScript 函数的目的是在给定的 JavaScript 上下文中执行一段 JavaScript 代码
而对于对象的属性应该使用:
JSObjectGetProperty获取 JavaScript 对象的属性值
JSGlobalContextCreate
以下是创建 JavaScript 对象的一些常见用途:
向 JavaScript 代码传递数据:如果您需要将 C++ 代码中的数据传递给 JavaScript 代码进行处理,可以创建一个 JavaScript 对象并将数据作为对象的属性。然后,您可以将此对象传递给 JavaScript 函数或将其添加到 JavaScript 上下文中。
从 JavaScript 代码获取数据:如果您需要从 JavaScript 代码获取数据并在 C++ 代码中处理,可以创建一个 JavaScript 对象,将其作为参数传递给 JavaScript 函数,然后从该对象中读取返回的数据。
调用 JavaScript 函数:如果您需要在 C++ 代码中调用 JavaScript 函数,可以创建一个 JavaScript 对象并将其作为参数传递给 JavaScript 函数。这个对象可以包含函数的参数,以及一个回调函数,该回调函数可以在 JavaScript 代码中调用以将结果传递回 C++ 代码。
创建自定义 JavaScript 类型:如果您需要在 C++ 代码中创建自定义 JavaScript 类型,可以使用 JSObjectMake 创建具有特定属性和方法的对象。这允许您在 JavaScript 代码中使用这些自定义类型,就像使用内置 JavaScript 对象一样。
总之,创建 JavaScript 对象的主要目的是在 C++ 代码和 JavaScript 代码之间建立通信和交互。这使得在 C++ 代码中可以灵活地处理 JavaScript 数据和逻辑,从而实现更丰富的功能和集成。
JSObjectMake是一个JavaScriptCore C API函数,用于在C++代码中创建一个新的JavaScript对象。这个函数的原型如下: