什么是 PHP 中的 Closures/Lambda 或 Javascript 中的外行术语? [复制]

Posted

技术标签:

【中文标题】什么是 PHP 中的 Closures/Lambda 或 Javascript 中的外行术语? [复制]【英文标题】:What is Closures/Lambda in PHP or Javascript in layman terms? [duplicate] 【发布时间】:2011-05-28 22:26:44 【问题描述】:

phpjavascript 中的闭包/Lambda 是什么?一个例子会很好地帮助我理解。我假设 Lambda 和闭包是一回事?

【问题讨论】:

【参考方案1】:

SO 已经有了答案:

What is a lambda (function)?

How do JavaScript closures work?

【讨论】:

【参考方案2】:

lambda 是一个匿名函数。闭包是一个带有其作用域的函数。我在这里的示例将使用 Python,但它们应该让您了解适当的机制。

print map(lambda x: x + 3, (1, 2, 3))

def makeadd(num):
  def add(val):
    return val + num
  return add

add3 = makeadd(3)
print add3(2)

map() 调用中显示了一个 lambda,add3() 是一个闭包。

JavaScript:

js> function(x) return x + 3  // lambda
function (x) 
    return x + 3;

js> makeadd = function(num)  return function(val) return val + num  
function (num) 
    return function (val) return val + num;;

js> add3 = makeadd(3) // closure
function (val) 
    return val + num;

js> add3(2)
5

【讨论】:

【参考方案3】:

匿名函数是没有名称声明的函数。

例如(使用 jQuery):

$.each(array, function(i,v)
    alert(v);
);

这里的函数是匿名的,它只是为了这个$.each调用而创建的。

闭包是一种函数(可以在匿名函数中使用,也可以命名),其中传递给它的参数被“捕获”并且即使超出范围也保持不变。

一个闭包(在 JavaScript 中):

function alertNum(a)
    return function()
        alert(a);
    

闭包返回一个匿名函数,但它本身不一定是匿名函数。

继续闭包示例:

alertOne = alertNum(1);
alertTwo = alertNum(2);

alertOnealertTwo 是在调用时分别提醒 1 和 2 的函数。

【讨论】:

【参考方案4】:

匿名函数,也称为闭包,允许创建没有指定名称的函数。它们作为回调参数的值最有用,但它们还有许多其他用途。 Lambda 函数允许快速定义未在其他地方使用的一次性函数。

【讨论】:

这不是 lambda。 是的。尝试阅读手册。 匿名函数和闭包不一样。 那家伙说“在 php 中”。不在计算机科学课程的典型定义中。但无论如何感谢您的反对。 @profitphp:别担心,这是一个很常见的误解。因此,我认为没有必要投反对票。闭包不是传入的函数,它是创建并附加到内部函数的上下文,无论它是否匿名。在 PHP 中,您指定要添加到闭包中的内容,在 JS 中,所有局部变量都可用。在最新版本的 Firebug 中,您实际上可以检查该闭包对象,非常酷!

以上是关于什么是 PHP 中的 Closures/Lambda 或 Javascript 中的外行术语? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的流上下文 - 它是啥?

什么是 PHP 中的用户级缓存 APCu 扩展?

PHP中的ABSPATH是啥意思?

什么是php中的文件指针?

PHP中的默认会话时间和路径是什么。如何改变?

PHP中的默认会话时间和路径是什么。如何改变?