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

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

【问题讨论】:

    标签: php javascript lambda closures


    【解决方案1】:

    【讨论】:

      【解决方案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 中,您实际上可以检查该闭包对象,非常酷!
          猜你喜欢
          • 2011-05-27
          • 1970-01-01
          • 2011-04-19
          • 2015-10-17
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          • 2019-06-28
          相关资源
          最近更新 更多