原生與前端是分別在兩個山頭,中間還隔著一條河,這兩個山頭上的人相互交流橋梁就是 JavaScriptCore
javaScriptCore,原本是WebKit中用來解釋執(zhí)行JavaScript代碼的核心引擎,iOS7開發(fā)蘋果開始講JavaScriptCore 框架引入iOS系統(tǒng),并將其作為系統(tǒng)級別的框架提供給開發(fā)者使用(JavaScriptCore.framework)。

image.png

image.png
通過JavaScripCore 在原生代碼中調(diào)用JavaScript 變量的例子
這里中用toNumber 舉例,當(dāng)然toString 數(shù)組、字典 類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];
//解析執(zhí)行腳本
[ct evaluateScript:@"function addition(x,y) {return x + y}"];
JSValue *addition = ct[@"addition"];
JSValue *resultValue = [addition callWithArguments:@[@(4),@(8)]];
//將addtion 函數(shù)s執(zhí)行的結(jié)果 轉(zhuǎn)成原生的NSNumber 來使用。
//如果你想在原生代碼中使用JavaScript 中的函數(shù)對象,可以通過 callWithArgument 方法傳入?yún)?shù),然后實現(xiàn)它的調(diào)用
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
//解析執(zhí)行腳本
[ct evaluateScript:@"function addition(x,y) {return x + y}"];
JSValue *addition = ct[@"addition"];
JSValue *resultValue = [addition callWithArguments:@[@(4),@(8)]];
//將addtion 函數(shù)s執(zhí)行的結(jié)果 轉(zhuǎn)成原生的NSNumber 來使用。
NSLog(@"funtion is %@; reslutValue is %@",addition,[resultValue toNumber]);
javaScirpt 調(diào)用 OC
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];
//在JSContext中使用原生Block 設(shè)置一減法 subtraction 函數(shù)
ct[@"subtration"] = ^(int x, int y){
return x - y;
};
//JSContext
JSValue *subValue = [ct evaluateScript:@"subtration(4,8);"];
NSLog(@"subValue(4,8) is %@",[subValue toNumber]);