- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我刚刚开始学习函数指针,当我阅读关于该主题的 K&R 章节时,第一个让我印象深刻的是,“嘿,这有点像闭包。”我知道这个假设在某种程度上是根本错误的,在网上搜索后,我没有找到任何关于这种比较的分析。
那么为什么 C 风格的函数指针与闭包或 lambda 有根本的不同呢?据我所知,这与函数指针仍然指向已定义(命名)函数的事实有关,而不是匿名定义函数的做法。
为什么将一个函数传递给一个函数在第二种情况下被认为比第一种情况更强大,在第二种情况下它是未命名的,而第一种情况下它只是传递一个普通的日常函数?
请告诉我为什么如此密切地比较两者是错误的。
最佳答案
lambda(或 closure)封装了函数指针和变量。这就是为什么在 C# 中,您可以执行以下操作:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
我在那里使用了一个匿名委托(delegate)作为闭包(它的语法比 lambda 等价物更清晰,更接近 C),它将 lessThan(堆栈变量)捕获到闭包中。当闭包被评估时,lessThan(其堆栈框架可能已被破坏)将继续被引用。如果我改变 lessThan,那么我改变比较:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
lessThanTest(99); // returns true
lessThan = 10;
lessThanTest(99); // returns false
在 C 中,这是非法的:
BOOL (*lessThanTest)(int);
int lessThan = 100;
lessThanTest = &LessThan;
BOOL LessThan(int i) {
return i < lessThan; // compile error - lessThan is not in scope
}
尽管我可以定义一个带两个参数的函数指针:
int lessThan = 100;
BOOL (*lessThanTest)(int, int);
lessThanTest = &LessThan;
lessThanTest(99, lessThan); // returns true
lessThan = 10;
lessThanTest(100, lessThan); // returns false
BOOL LessThan(int i, int lessThan) {
return i < lessThan;
}
但是,现在我在评估它时必须传递 2 个参数。如果我希望将此函数指针传递给 lessThan 不在范围内的另一个函数,我将不得不通过将其传递给链中的每个函数或将其提升为全局函数来手动使其保持事件状态。
虽然大多数支持闭包的主流语言都使用匿名函数,但并没有要求。您可以有没有匿名函数的闭包,也可以有没有闭包的匿名函数。
总结:闭包是函数指针+捕获变量的组合。
关于c - 函数指针、闭包和 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/208835/
我的问题是...在 TestObj 的 CallMeLaterTestObj 函数中,“this”是窗口对象,而不是 TestObj。我如何重构它,以便在 CallMeLater 函数中我不必包装 c
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 8 年前。 下面的代码返回:10
我尝试学习一种不熟悉的编程语言的第一件事就是它如何处理闭包。它们的语义通常与语言处理范围和其他各种棘手位的方式交织在一起,因此理解它们可以揭示该语言的其他几个方面。另外,闭包是一种非常强大的构造,并且
我正在学习使用闭包,但我不确定什么是适合我的情况的最佳方法。为了清楚起见,我编辑了我的代码,它包含虚拟代码。如果用户单击 test 元素,我必须访问 handleCannon 函数。如果我在 onlo
所以在 d3 中我想要一个函数数组 var data = [44,23]; var line = []; for (var i = 0; i < data.length; i++) { lin
对于另一个闭包问题,我提前表示歉意,但我想澄清一下我对闭包在 JavaScript 中的实现方式的理解。 考虑以下代码: 01 'use strict'; 02 function foo() {} 0
闭包是我在 JS 中仍然没有完全掌握的东西。我认为这是一个关闭问题。我正在尝试创建一个进度条。每 x 秒我想增加一个 DIV 的宽度。这是应该执行此操作的部分: for(i=0;i<=counter;
我以为我对 JavaScript 中的 this 对象有了合理的理解。在处理对象、回调以及事件和处理程序时,我从远古以来就没有遇到过问题。然而,现在一切都变了。 我已经爱上了 JavaScript。纯
我创建的对象有问题,看起来像这样: var myObject = { AddChildRowEvents: function(row, p2) { if(document.at
我正在制作一个 DOM 生成器,我已经成功地工作了,但现在我正在尝试分配一些速记函数,以便 div() -> e("div") 这是我的代码: //assign these objects to a
有没有人愿意为像这样的闭包(使用 C# 获得)和匿名内部类发布等效的 Java 代码? public static Func IncrementByN() { int
我在控制台中运行此命令来查找结果的值,但我对为什么它是 122 感到困惑。我无法弄清楚为什么,也无法弄清楚在代码中如何使用奖金。有人可以解释一下奖金的值(value)以及他们如何获得开头声明的每个变量
以下代码定义了两个函数:lines 和 circles,它们返回一个函数 f 和 g分别。函数 f 和 g 相等(() -> size)只是为了简单起见,但通常它们是变量 的不同函数>尺寸。 line
function sampleDelay(delay) { return function(functionArray) { var count = 0; var func
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: What is the difference between a 'closure' and a 'lambda'?
我正在尝试弄清楚 std::function 与闭包结合使用时发生了什么。我还不能全神贯注,例如:正在调用什么构造函数?任何人都可以发布一个工作示例来替换 std::function 以支持以下示例中
闭包通过引用(而不是值)存储它们的外部变量。但是,在下面的代码中,我想按值存储。谁能告诉我如何使用 IIFE 做到这一点? var i = -1; var f = function () {
我刚刚开始学习函数指针,当我阅读关于该主题的 K&R 章节时,第一个让我印象深刻的是,“嘿,这有点像闭包。”我知道这个假设在某种程度上是根本错误的,在网上搜索后,我没有找到任何关于这种比较的分析。 那
我的理解是,Java(以及 Clojure)中使用的默认 ClassLoader 持有指向任何创建的匿名类的指针,因此,持有 lambdas 和闭包。这些是 从不 垃圾收集,因此代表“内存泄漏”。有一
我很抱歉这个不那么具体的标题,因为我的英语不够好,无法在标题中清楚地描述这种情况。 我有这样的代码: var e = document.getElementsByClassName( "test" )
我是一名优秀的程序员,十分优秀!