hel*_*hod 7 javascript continuations
我正在尝试解决这个关于Continuation Passing的JavaScript Closure教程的最后一次练习.
这是练习:
定义一个名为bothC的函数,类似于seqC,它接受函数fC和gC以及continuation的成功和失败.函数fC和gC都只是成功和失败的延续.你的函数bothC应该同时调用fC和gC,但是如果两个都成功则只调用成功,否则只调用失败.别忘了,你的功能永远不会回来!
这似乎是一个有效的答案:
var bothC = function (fC, gC, success, failure) {
fC(
function() {
gC(success, failure);
},
function() {
gC(failure, failure);
}
);
};
Run Code Online (Sandbox Code Playgroud)
但为什么我不能这样做呢?
var bothC = function(fC, gC, success, failure) {
fC(gC(success, failure), gC(failure, failure));
}
Run Code Online (Sandbox Code Playgroud)
每当你有一个函数后面跟着一个参数集的parens(即使没有参数,那仍然是一个参数集),给JS的消息是execute immediately.这意味着gC(success, failure)实际运行gC然后返回gC将返回的任何内容.fC(gC(success, failure), gC(failure, failure));基本上意味着,"调用fC返回gC(success, failure)和gC(failure, failure)作为参数"
为了防止这个动作仍然使它可以调用,你需要将它包装成一个function(){}(它可以是匿名的或不是匿名的).这将使它成为一个可返回和可调用的对象,而不仅仅是一个方法调用.fC(function() {gC(success, failure); }, function() { gC(failure, failure); } );表示" fC使用将调用gC(success, failure)的函数调用以及将gC(failure, failure)作为参数调用的函数"
就像一个FYI一样,Sussman和Steele表明延续和闭合或多或少是相同的,差异基本上是在语法上(这是在70年代后期.阅读Gabriel/Steele 历史的Lisp Pg.33) .JS有很好的闭包语法,但在我看来,当前流行语言中延续的最好例子是Python yield语法.只是说.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |