Javacript中的后续传递风格.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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),其允许执行(或是浏览器呈现工作)的继续,并且一旦请求完成就调用所提供的回调方法。在

文档评论(0)

md85173 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档