了解JavaScript中的延续

时间:2011-08-08 16:20:55

标签: javascript continuations

我正在尝试解决此JavaScript Closure Tutorial的最后一次练习,该练习将继续传递。

这是练习:

  

定义一个名为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);    
      }
    );
};

但为什么我不能这样做呢?

var bothC = function(fC, gC, success, failure) {
  fC(gC(success, failure), gC(failure, failure));
}

3 个答案:

答案 0 :(得分:6)

每当你有一个函数后跟参数集的parens(即使没有参数,仍然是一个参数集),JS的消息是execute immediately。这意味着gC(success, failure)实际运行gC然后返回gC将返回的任何内容。 fC(gC(success, failure), gC(failure, failure));基本上意味着,“在fCgC(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 {{3}第33页)。 JS具有很好的闭包语法,但在我看来,当前流行语言中延续的最好例子是Python yield语法。只是说。

答案 1 :(得分:2)

因为它调用gC(而不是推迟)并将其结果传递给fC

答案 2 :(得分:2)

您的代码无效,因为在调用gC时,它会立即调用bothC两次。 fC应该采用两个延续,意思是,它们必须是可调用的函数,而不是调用函数的结果。