原生与前端是分别在两个山头,中间还隔着一条河,这两个山头上的人相互交流桥梁就是 JavaScriptCore
javaScriptCore,原本是WebKit中用来解释执行JavaScript代码的核心引擎,iOS7开发苹果开始讲JavaScriptCore 框架引入iOS系统,并将其作为系统级别的框架提供给开发者使用(JavaScriptCore.framework)。
通过JavaScripCore 在原生代码中调用JavaScript 变量的例子
这里中用toNumber 举例,当然toString 数组、字典 类toObjectOfClass都可以
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
[ct evaluateScript:@"var i = 4 * 8"];//返回的是JSValue 对象
NSNumber *num = [ct[@"i"] toNumber];
NSLog(@"var is %@",num);
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
//解析执行脚本
[ct evaluateScript:@"function addition(x,y) {return x + y}"];
JSValue *addition = ct[@"addition"];
JSValue *resultValue = [addition callWithArguments:@[@(4),@(8)]];
//将addtion 函数s执行的结果 转成原生的NSNumber 来使用。
//如果你想在原生代码中使用JavaScript 中的函数对象,可以通过 callWithArgument 方法传入参数,然后实现它的调用
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
//解析执行脚本
[ct evaluateScript:@"function addition(x,y) {return x + y}"];
JSValue *addition = ct[@"addition"];
JSValue *resultValue = [addition callWithArguments:@[@(4),@(8)]];
//将addtion 函数s执行的结果 转成原生的NSNumber 来使用。
NSLog(@"funtion is %@; reslutValue is %@",addition,[resultValue toNumber]);
javaScirpt 调用 OC
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
//在JSContext中使用原生Block 设置一减法 subtraction 函数
ct[@"subtration"] = ^(int x, int y){
return x - y;
};
//JSContext
JSValue *subValue = [ct evaluateScript:@"subtration(4,8);"];
NSLog(@"subValue(4,8) is %@",[subValue toNumber]);