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/

JSC学习笔记:JavaScriptCore 初识的更多相关文章

  1. Storm学习笔记 - Storm初识

    Storm学习笔记 - Storm初识 1. Strom是什么? Storm是一个开源免费的分布式计算框架,可以实时处理大量的数据流. 2. Storm的特点 高性能,低延迟. 分布式:可解决数据量大 ...

  2. LevelDB学习笔记 (1):初识LevelDB

    LevelDB学习笔记 (1):初识LevelDB 1. 写在前面 1.1 什么是levelDB LevelDB就是一个由Google开源的高效的单机Key/Value存储系统,该存储系统提供了Key ...

  3. Java学习笔记心得——初识Java

    初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...

  4. NuGet学习笔记1——初识NuGet及快速安装使用

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  5. NuGet学习笔记(1) 初识NuGet及快速安装使用

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  6. python学习笔记六 初识面向对象上(基础篇)

    python面向对象   面向对象编程(Object-Oriented Programming )介绍   对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...

  7. NuGet学习笔记(1)——初识NuGet及快速安装使用

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  8. NuGet学习笔记(1)——初识NuGet及快速安装使用(转)

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  9. NuGet学习笔记(1) 初识NuGet及快速安装使用[转]

    来自:http://www.cnblogs.com/lzrabbit/archive/2012/05/01/2477607.html 关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学 ...

随机推荐

  1. C期未考试参考答案题1

    输入一个3行5列的矩阵数据,输出矩阵中每行最大值. 输入描述 输入3行5列共15个整数. 输出描述 输出每行的最大值.每个最大值占一行 #include<stdio.h>#include& ...

  2. Spring配置扫描mybatis的mapper文件注意:

    一般会将不业务的mapper文件放到不同的包中: spring配置扫描就需要配置下面的方式(两个*): <!-- mybatis文件配置,扫描所有mapper文件 --> <bean ...

  3. 容联手机接口封装到ThinkPHP3.2.菜鸟图文教学

    今天来说下短信发送技术. 使用的是 容联http://www.yuntongxun.com/ 用法很简单, 具体要知道的参数有 ACCOUNT SID   应用ID AUTH TOKEN 应用toke ...

  4. php isset — 检测变量是否设置 foreach循环运用

    例子 $a = 336 ; $b = 33 ; function large($x,$y){ if((!isset($x))||(!isset($y))){ // echo "this fu ...

  5. JavaScript Infinite scroll & Masonry

    // infinitescroll() is called on the element that surrounds // the items you will be loading more of ...

  6. lda模型的python实现

    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,最近看了点资料,准备使用python实现一下.至于数学模型相关知识,某度一大堆,这里也给出之前参考过的一个挺详细 ...

  7. MVC 后台DataTable 前台遍历

    /// <summary> /// 多级审批流展示 /// </summary> /// <returns></returns> public Acti ...

  8. Genymotion如何访问本地服务器?

    找到原因了,其实跟Genymotion没有关系,因为他本身是作为VirtualBox的一个虚拟OS在运行. 默认情况下,查看Genymotion的网络配置,是Host-Only模式: Microsof ...

  9. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  10. hdu 1150 Machine Schedule hdu 1151 Air Raid 匈牙利模版

    //两道大水……哦不 两道结论题 结论:二部图的最小覆盖数=二部图的最大匹配数 有向图的最小覆盖数=节点数-二部图的最大匹配数 //hdu 1150 #include<cstdio> #i ...