问题标签 [function-literal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
recursion - 哪些语言支持*递归*函数文字/匿名函数?
如今,似乎有不少主流语言支持函数文字。它们也被称为匿名函数,但我不在乎它们是否有名字。重要的是,函数文字是一个表达式,它产生一个尚未在其他地方定义的函数,例如在 C 中,&printf
不计算在内。
编辑添加:如果你有一个真正的函数文字表达式<exp>
,你应该能够将它传递给一个函数f(<exp>)
或立即将它应用于一个参数,即。<exp>(5)
.
我很好奇哪些语言可以让你编写递归的函数文字。维基百科的“匿名递归”文章没有给出任何编程示例。
让我们以递归阶乘函数为例。
以下是我知道的:
JavaScript / ECMAScript 可以做到这一点
/li>callee
:在语言中很容易使用
letrec
,例如 Haskell(它叫它let
):let fac x = if x<2 then 1 else fac (x-1) * x in fac
在 Lisp 和 Scheme 中有等价物。请注意, 的绑定
fac
是表达式的局部变量,因此整个表达式实际上是一个匿名函数。
还有其他人吗?
scala - 默认类型参数化函数字面量类参数
这是预期的行为还是错误?考虑以下特征(无论是类,都无所谓):
这是我所期望的:
但是这个?
scala - 我应该如何避免无意中捕获函数文字中的本地范围?
我会用一个 Scala 示例来问这个问题,但这很可能会影响其他允许混合命令式和函数式样式的语言。
这是一个简短的示例(UPDATED,见下文):
现在iterator.filterNot
懒惰地工作,这很棒!因此,我们希望返回的迭代器不会消耗太多内存(实际上是 O(1))。然而,遗憾的是,我们犯了一个可怕的错误:因为filterNot
它是惰性的,所以它保持对函数字面量的引用huge contains _
。
因此,虽然我们认为该方法在运行时需要大量内存,并且可以在方法终止后立即释放该内存,但实际上内存被卡住了,直到我们忘记返回的Iterator
.
(我就是犯了这么一个错误,追了好久!看heap dumps就可以抓到这样的东西……)
避免此问题的最佳做法是什么?
似乎唯一的解决方案是仔细检查在作用域结束后仍然存在并捕获中间变量的函数文字。如果您正在构建一个非严格的集合并计划返回它,这会有点尴尬。谁能想到一些很好的技巧,Scala 特定的或其他的,可以避免这个问题,让我写出漂亮的代码?
更新:我之前给出的例子很愚蠢,正如下面 huynhjl 的回答所示。曾经是:
事实上,现在我对这些事情的运作方式有了更好的了解,我并不那么担心!
scala - 如何像这样简化scala的函数文字?
我是 scala 的新手,并试图编写一个函数文字来检查给定的整数是否为奇数。我的第一次尝试是:
val isOdd = (x:Int) => (x & 1) == 1
它工作得很好,而且由于参数 x 在这个函数文字中只出现一次,我很想使用“_”符号来进一步简化它,如下所示:
val isOdd = ((_:Int) & 1 ) == 1
但是这次编译器抱怨:
这个警告是什么意思?为什么编译器将其识别((_ :Int) & 1)
为新对象而不是产生值的按位运算?有没有办法使用“_”符号来编写这个函数文字?
javascript - 如何确定对象是使用对象文字还是对象构造函数调用创建的?
更具体地说,您将如何确定某个对象是否是使用文字创建的?
显然,如果您比较上述任何两个,例如:
...前两个警报将显示false
,而最后两个警报将给出[Object object]
例如,如果我想这样做:
......如何去做呢?
我已经查看了如何确定对象是否是 Javascript 中的对象文字?,但它没有回答我的问题。
scala - Scala 下划线用于简化函数字面量的语法
我有以下代码:
我试图将最后一句话简化为:
但是口译员说:
我试图更明确地说明类型:
编译器和我彼此不理解:(
此致,
斯坦
actionscript-3 - ActionScript 3 中函数和函数字面量之间的区别?
ActionScript 3 中以下两个函数定义有什么区别?
和
scala - 如何定义一个将函数文字(带有隐式参数)作为参数的函数?
我希望能够在这些行上做一些事情(不会编译):
然后像这样使用它:
但我最接近的工作解决方案是:
我认为该语言目前不允许这样的结构,但是,有什么建议或解决方法可以达到类似的结果吗?
次要更新:我用上述代码的略微扩展版本创建了一个要点,并尝试了几次模拟这种文字。到目前为止,CheatEx 的版本是最好的。
javascript - 更好的方法清空变量,Javascript中的对象
我正在为移动设备构建一些东西,并希望以某种方式清除空对象、变量以释放一些内存。在这里,我有两个简单的示例,我相信它们都是匿名函数,但是哪种方法更好或更有效?对不起,如果我弄错了。对我来说,两者似乎都在做同样的事情,尽管我更喜欢第一个,因为在我需要它之前不会创建对象。第二个版本将立即执行用于创建变量、对象等的代码,但在我需要它之前不会执行主构建功能。
我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用。
V1
V2
稍后在 html 或事件中
javascript - JavaScript 对象字面量方法:递归调用
是否可以从对象文字递归调用方法?
例如:
错误:在定义之前使用了“f”。
谢谢。