我花了一个小时阅读这个网站上的很多帖子,其他人关于lambdas和closures.我想我明白它们是什么,即它们是如何工作的,但我不明白为什么它们存在.我看到的许多例子含糊地提到了他们的"权力",但在每一种情况下,我都能想到一种更简单的方法来完成所说明的内容.也许这是因为这些例子故意过于简单(为了便于理解),或者我可能很密集.但我真正喜欢的是看到一个明确的例子,说明你可以通过一个闭包或lambda完成的事情,如果没有一个你就无法实现.也许这是一个有问题的问题,因为所有编程范例最终归结为相同的机器指令,并且可以用一种语言完成的任何操作都可以在另一种语言中完成.所以我想我真正要问的是一个用闭包做的事情的例子比没有做的更优雅(对于我见过的任何例子似乎都不是这样).
这就是我所说的.
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define x (make-counter))
(x) returns 1
(x) returns 2
...etc...
Run Code Online (Sandbox Code Playgroud)
我真的不知道Scheme,但我想我知道发生了什么.但是,这不是更直接并且完成同样的事情吗?伪代码:
function incrementCount(var counter) {
counter++;
return counter;
}
counter = 1;
counter = incrementCount(counter);
counter = incrementCount(counter);
Run Code Online (Sandbox Code Playgroud)
这是lambda上的另一个:什么是lambda(函数)?
给出的JavaScript示例:
var adder = function (x) {
return function (y) {
return x + y;
};
};
add5 = adder(5);
add5(1) …Run Code Online (Sandbox Code Playgroud) 我对编程很新,在做很多阅读时,这个lambda的概念不断出现,但是我很难理解它实际上是什么,如何实现它将使我的编程生活变得更好.首先,什么是lambda,第二,它是如何实现的?
感谢所有发布的人.正如评论中提到的,这是重复的,但是这里有很多很棒的答案,我想为社区保留它们,所以我把它变成了一个社区帖子.以下是其他问题的链接:
我问一个问题.它是关于JavaScript的闭包,而不是它们如何工作.
David Flanagan在他的"JavaScript The Definitive Guide 6th Edition"中写道:
... 从技术上讲,所有JavaScript函数都是闭包:它们是对象,并且它们具有与之关联的作用域链....
它是否正确?我可以将每个函数(函数对象+它的作用域)称为"闭包"吗?
堆栈'标签'封闭'说:
闭包是一个第一类函数,它引用(关闭)变量来自定义它的作用域.如果闭包在其定义范围结束后仍然存在,则它关闭的变量也将继续存在.
在JavaScript中,每个函数都引用来自定义它的范围的变量.所以,它仍然有效.
问题是: 为什么许多开发人员会这样想?这个理论有问题吗?它不能用作一般定义吗?
我正在学习 Scheme,刚刚遇到了 Closures。提供了以下示例,演示了闭包的使用:
(define (create-closure x)
(lambda () x))
(define val (create-closure 10))
Run Code Online (Sandbox Code Playgroud)
据我了解,当评估上述代码时,val将等于10. 我意识到这只是一个例子,但我不明白闭包会有什么帮助。有什么优点以及需要这样一个概念的场景是什么?
现有的内部类有什么问题,为什么内部类不能用于表示闭包?
目前,我将在这里发布一些资源入手.
首先,下面列出了什么是封闭的概述.它与语言无关.我建议阅读它关闭http://martinfowler.com/bliki/Closure.html
稍后加一点
[2007年1月]闭包的定义http://gafter.blogspot.com/2007/01/definition-of-closures.html
结束
[2011年12月] Lambda状态 http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html
[2007年10月]编程语言高级主题:Java闭包http://www.youtube.com/watch?v=0zVizaCOhME
[2011年1月4日] JSR 292善良:使用invokedynamic进行Lambda到SAM类型的转换http://weblogs.java.net/blog/forax/archive/2011/01/04/jsr-292-goodness-lambda-sam-type γ变换-使用-invokedynamic
可能重复:
什么是'关闭'?
我越来越多地阅读关于闭包的内容,但从实际的角度来看,我并没有真正了解它.我阅读了维基百科页面,但它并没有真正清楚我的内容,因为我有更多的编程实践背景(自学)而不是计算机科学背景.如果这是一个冗长的问题,我道歉,因为我的初步搜索没有产生任何真正为我解答的东西.
编辑:感谢您指出我正确的方向!我之前已经清楚地回答过这个问题,所以我将结束这个问题.
我写了以下内容来动画div中的文本动画,但我找不到最后一个角色是如何重复打印的.
var textClass = $(".first-text");
var text = textClass.text();
textClass.text("");
for (var i in text) {
$(textClass).animate({
opacity: 0.25
}, 200, function() {
$(textClass).append(text.charAt(i));
});
}Run Code Online (Sandbox Code Playgroud)
p:not(:first-child) {
display: none;
}
p {
margin: 0 auto;
font-size: 24px;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="animate-text">
<p class="first-text">HTML</p><br>
</div>Run Code Online (Sandbox Code Playgroud)
如果我尝试警告i或者的值text.charAt(i),我总是得到所需的输出,但是当我尝试在div中追加它时,我总是得到重复打印的相同的最后一个字母.我找不到我错的地方.我无法在逻辑中找到错误.
如果有人能够通过上述代码告诉我我的错误,我会很高兴听到它.
这是我尝试此代码的小提琴的链接.
提前致谢.
对于以下问题:http://pastie.org/4825115,这是我的代码:http://pastie.org/private/n22zohyshn2ymqrbrb3g
def randList(len: Int, n: Int): List[Int] = len match {
case 0 => List()
case len => scala.util.Random.nextInt(n) :: randList(len-1, n)
}
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么randList被称为闭包.
我一直很困惑什么是 C++ 中的闭包。我读过这篇什么是“关闭”?但几乎所有答案都指的是 JavaScript,但我认为 C++ 和 JavaScript 之间的闭包存在一些差异。所以我发现很难将闭包的 JavaScript 描述与 C++ 相匹配。
例如,几乎所有答案都以函数返回函数为例来演示 JavaScript 中的闭包。但是我在 C++ 中没有找到类似的模式。
更重要的是,在 JavaScript 中没有所谓的“捕获列表”这样的东西。
示例 1:
int a = 3;
int am_I_a_closure(int c){
return c + a;
}
int main(){
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,通过正常的名称查找过程,如果在当前作用域中找不到名称,则在外部作用域中找到它,然后在更多外部作用域中找到它...
为什么需要捕获列表?为什么需要捕获外部作用域变量?不能通过正常的名称查找来完成吗?
示例 2:
int main(){
int a = 3;
{
int b = 5;
{
int c = 4;
{
std::cout << a+b+c <<std::endl;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例 3: …