JSC学习笔记:JavaScriptCore 初识

时间:2024-01-20 09:30:57

JSContext/JSValue

JSContext是运行JavaScript的上下文环境,是一个全局环境实例;类似于浏览器端的window对象,表示浏览器的窗口;在浏览器中,所有JavaScript全局对象、属性、方法均自动成为window对象的成员。创建一个JSContext后,可以很容易地运行JavaScript代码创建变量、方法,进行相应计算,Swift中使用方法如下:

let context = JSContext()
context.evaluateScript("var num = 12")
context.evaluateScript("var result = function(value) {return value * 3}")
let tripleNum: JSValue = context.evaluateScript("triple(num)")
print("Tripled: \(tripleNum.toInt32())")

任何出自JSContext的值都被包裹在一个JSValue对象中,不管是字符串、数字、数组、对象和方法等;JavaScript中的错误(null)和特殊值(undefined)也会包含在其中。

JSValue提供一系列方法用于转换JavaScript类型到Obejective-C和Swift。

使用下标值访问上下文context中的值

JSContext使用字符串作为下标,类似于JavaScript中的属性字典;JSValue允许使用字符串或者整数来得到里面的对象。

context.evaluateScript("var stringArray = ['first', 'second', 'third']")
let str = context.objectForKeyedSubscript("stringArray")
let firstStr = str.objectAtIndexedSubscript(0)
print("The first str : \(firstStr.toString())")

Swift调用JavaScript函数

通过context的 objectForKeyedSubscript方法获取JS中属性对应的方法,通过 callWithArguments方法实现方法的调用,注意参数是对象,传入参数数组对象。代码如下:

let jsFunction = context.objectForKeyedSubscript("result")
let addResult = jsFunction.callWithArguments([5])
print("Result :\(addResult.toInt32())")

捕获JS执行中的异常

JS执行环境JSContext中有个exceptionHandler属性,通过该属性对应的回调方法可以得到JS执行中的异常,代码如下:

context.exceptionHandler = {context, exception in
print("JS Error: \(exception)")
}
context.evaluateScript("function multiply(value1, value2) { return value1 * value2")

输出结果如下:

Tripled: 36
The first str : first
Result :15
JS Error: SyntaxError: Unexpected end of script

学习资料:http://nshipster.cn/javascriptcore/