我正在尝试解决这个JavaScript闭包教程的最后一个练习,它需要连续传递。
这是一项工作:
定义一个名为bothC的函数,类似于seqC,它接受函数fC和gC以及连续成功和失败。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));
}发布于 2011-08-08 16:30:08
任何时候,如果在参数集周围有一个函数后面跟着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); } );的意思是,“用调用gC(success, failure)的函数和调用gC(failure, failure)作为参数的函数调用gC(failure, failure)”。
就像FYI一样,Sussman和Steele表明,延续和闭包或多或少是一回事,区别基本上是语法上的(这是在70年代后期。阅读加布里埃尔/斯蒂尔李斯特的历史 Pg. 33)。JS有很好的闭包语法,但在我看来,在目前流行的语言中延续的最好例子是Python yield语法。我只想说。
发布于 2011-08-08 16:23:20
因为它调用gC (而不是延迟)并将其结果传递给fC。
发布于 2011-08-08 16:24:27
您的代码不能工作,因为当调用gC时,它会立即调用bothC两次。fC应该接受两个连续,这意味着它们必须是可调用的函数,而不是调用函数的结果。
https://stackoverflow.com/questions/6985168
复制相似问题