JavaScriptCore介绍
JavaScriptCore 是 JavaScript 引擎,通常会被叫做虚拟机,专门设计来解释和执行 JavaScript 代码,可以理解为一个浏览器的运行内核。
JavaScriptCore Framework 是 iOS7 引入的新功能,其实就是基于 Webkit 中以 C/C++ 实现的 JavaScriptCore 的一个封装,大多数 iOS 比较熟悉的是它的 Objective-C API,可以用简洁的方式实现 JS 与Native 交互,其实它还有C API的部分,虽然也是开源的,但是在查看源代码时只有较少的介绍,而且我们知道 Objective-C API 只是 C API 接口的封装。本文主要介绍 C API 部分,帮助大家更好理解 JavaScriptCore Framework。
JavaScriptCore C API
JavaScriptCore C API 部分包含六个类 下面我们详细解释每个类的作用及用法
JSBase.h
JavaScriptCore 的接口文件,这个类中 import 了其他的类,简单封装了其他的 C API。
JSContextRef.h
JSContextRef 相当于 Objective-C 中的 JSContext,主要提供 JS 执行的上下文环境。
JSObjectRef.h
JSObjectRef 相当于 Objective-C 中的 JSObject,它代表一个JavaScript对象,交互的核心都在这个类中实现。
JSStringRef.h
是 JavaScript 中基本的字符串表示形式。
JSStringRefCF.h
包含 CFString 便利的方法。
JSValueRef.h
JSValueRef 相当于 Objective-C 中的 JSValue ,对应一个 JavaScript 的值,它是所有JavaScript值的基本类型
JSBase.h
定义了 JavaScriptCore 接口文件 ,主要提供了三个方法
1 | //检查JavaScript 字符串中的语法错误。 |
JSContextRef.h
主要提供 JS 执行所需所有资源和环境
1 | //获取全局的 globalObject 对象,该对象将全局的 JavaScript 设置为跟对象,因此我们可以将我们自己的对象定义为 JavaScript 执行环境。 |
JSObjectRef.h
是一个 JavaScript 对象,主要提供了两部分API,一部分是创建 JS 对象,还有一部分是给创建的 JS 对象添加对应的 Callback。
Functions
1 | // 创建 JavaScript 类 JSClassCreate JSClassRelease JSClassRetain |
callBacks
在创建一个JS对象的同时,可以给该对象设置对应的callback,例如可以在先创建一个functionJSObjectMakeFunction
,同时设置该方法被调用的callback JSObjectCallAsFunctionCallback
最后调用该方法 JSObjectCallAsFunction
此时callback设置的方法就会响应
上述所有创建对象的方法都有对应的callback可以设置,我们可以灵活的使用这些方法
如
1 | Type Alias JSObjectCallAsConstructorCallback //当该对象被座位构造函数调用是响应callback |
JSValueRef.h
一个 JavaScript 值,提供用Object-C的基础数据类型来创建 JS 的值,或者将JS 的值转变为OC的基础数据类型
1 | //获取JavaScript值类型 |
JSStringRef.h
JavaScript 对象中字符串对象,公开的api包括如下
1 | JSStringCreateWithCharacters |
JSStringRefCF.h
CFString 与 JavaScript string 相互转化
1 | CFStringRef JSStringCopyCFString(CFAllocatorRef alloc, JSStringRef string); |
测试Demo
上面介绍完整个JavaScriptCore C API部分,下面我们通过一个demo来详细分析如何使用这些api
1 | #import "ViewController.h" |
执行结果
2018-07-02 20:29:47.485072+0800 ObjectCallAsFunctionCallback
2018-07-02 20:29:47.485290+0800 ObjectGetPropertyCallback
2018-07-02 20:29:47.489448+0800 ObjectConstructorFinalize
下面我们详细分析这段代码
1 | contextGroup 是JS执行的虚拟机,后续所有的一切基于它来进行 |
github地址: https://github.com/Richard-zhang-iOS/JavaScriptCore-C-Demo 原创不易,欢迎star