- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Javacript中的后续传递风格
JavaScript中的后续传递风格
现在,CPS作为非阻塞式(通常是分布式的)系统的编程风格而被再次发掘出来。
我对CPS很有好感,因为它是我获取博士学位的一个秘密武器。它十有八九帮我消减掉了一两年的时间和一些难以估量的痛苦。
本文介绍了CPS所扮演的两种角色作为JavaScript中的一种非阻塞编程风格,以及作为一种功能性语言的中间形式(简要介绍)。
内容包括:
◆JavaScript中的CPS
◆CPS用于Ajax编程
◆用在非阻塞式编程(node.js)中的CPS
◆CPS用于分布式编程
◆如何使用CPS来实现异常
◆极简Lisp的一个CPS转换器
◆如何用Lisp实现call/cc
◆如何用JavaScript实现call/cc
请往下阅读以了解更多内容。
什么是持续传送风格?
如果一种语言支持后续(continuation)的话,编程者就可以添加诸如异常、回溯、线程以及构造函数一类的控制构造。
可惜的是,许多关于后续的解释(我的也包括在内)给人的感觉是含糊不清,令人难以满意。
后续传递风格是那么的基础。
后续传递风格赋予了后续在代码方面的意义。
更妙的是,编程者可以自我发掘出后续传递风格来,如果其受限于下面这样的一个约束的话:
没有过程被允许返回到它的调用者中永远如此。
存在的一个启示使得以这种风格编程成为可能:
过程可以在它们返回值时调用一个回调方法。
当一个过程(procedure)准备要返回到它的调用者中时,它在返回值时调用当前后续(current continuation)这一回调方法(由它的调用者提供)
一个后续是一个初始类型(first-class)返回点。
例子:标识函数
考虑这个正常写法的标识函数:
function id(x) { return x ; }
然后是后续传递风格的:
1. function id(x,cc) { 2. cc(x) ; 3. }
有时候,把当前后续参数命名为ret会使得其目的更为明显一些:
1. function id(x,ret) { 2. ret(x) ; 3. }
例子:朴素阶乘
下面是标准的朴素阶乘:
1. function fact(n) { 2. if (n ==0) 3. return1 ; 4. else 5. return n * fact(n-1) ; 6. }
下面是CPS风格实现的:
1. function fact(n,ret) { 2. if (n ==0) 3. ret(1) ; 4. else 5. fact(n-1, function (t0) { 6. ret(n * t0) }) ; 7. }
接下来,为了使用这一函数,我们把一个回调方法传给它:
1. fact (5, function (n) { 2. console.log(n) ; // 在Firebug中输出120 3. })
例子:尾递归阶乘
下面是尾递归阶乘:
1. function fact(n) { 2. return tail_fact(n,1) ; 3. } 4. function tail_fact(n,a) { 5. if (n ==0) 6. return a ; 7. else 8. return tail_fact(n-1,n*a) ; 9. }
然后,是CPS实现方式的:
1. function fact(n,ret) { 2. tail_fact(n,1,ret) ; 3. } 4. function tail_fact(n,a,ret) { 5. if (n ==0) 6. ret(a) ; 7. else 8. tail_fact(n-1,n*a,ret) ; 9. }
CPS和Ajax
Ajax是一种web编程技术,其使用JavaScript中的一个XMLHttpRequest对象来从服务器端(异步地)提取数据。(提取的数据不必是XML格式的。)CPS提供了一种优雅地实现Ajax编程的方式。使用XMLHttpRequest,我们可以写出一个阻塞式的过程fetch(url),该过程抓取某个url上的内容,然后把内容作为串返回。
这一方法的问题是,JavaScript是一种单线程语言,当JavaScript阻塞时,浏览器就被暂时冻结,不能动弹了。这会造成不愉快的用户体验。一种更好的做法是这样的一个过程fetch(url, callback),其允许执行(或是浏览器呈现工作)的继续,并且一旦请求完成就调用所提供的回调方法。在
您可能关注的文档
最近下载
- 航空运输地理单元四中国航空区划描述.ppt
- 喉肿瘤的护理措施.pptx VIP
- 第10课《往事依依》教学设计2024—2025学年统编版语文七年级上册.docx
- 中华民族一家亲,同心共筑中国梦.pptx VIP
- 职业技术学院处室工作人员学年考核细则.doc
- 基于plc的自动售货机系统设计—学士学位论文.doc VIP
- 知道网课跨文化沟通心理学智慧树章节测试答案2023.docx
- 苏教版五年级上册《我们的大脑》教学设计.docx
- 众泰-T600-产品使用说明书-T600 2.0T 豪华型DCT-JNJ6460QT-T600车系使用手册20131201.pdf
- RTO 操作规程考试试题及答案.docx
文档评论(0)