当前位置: 首页 > 后端技术 > PHP

先说说我理解的闭包,js、php、golang中的闭包

时间:2023-03-29 22:40:46 PHP

我是从js开始编程的。当时网上很多人说闭包难,各地对闭包的解释也千奇百怪。.现在开始接触js以外的各种编程语言,发现不仅是js,php、java、c++等各种编程语言都有闭包,大体意思都差不多。js中的闭包比较权威,闭包是这样解释的:闭包是指函数可以访问另一个函数范围内的变量。创建闭包的一种常见方法是在另一个函数中创建一个函数。一开始这个解释有点乱,理解为闭包是函数中的函数。现在看来是有问题了。不知道是不是翻译的问题。全局范围内的函数不也是闭包吗?再看看mdn的解释:闭包(closures)是使用变量、函数、闭包等执行的函数作用域,被作用域封闭。通常我们通过它们相应的功能来引用这些范围。(可以访问独立数据的函数)这是什么,我一头雾水。个人理解:闭包就是引用外部变量的函数。这两个条件形成一个闭包。在我们的日常使用中,外部变量很少是全局变量,经常使用一个父函数返回一个子函数。子函数引用父函数中的变量。这个是有病的,因为它被引用了,所以在父函数执行完后并没有被销毁,变成了一个自由变量。php中的闭包最近不满足于只做前端,开始使用php。PHP确实是最好的语言,抄它就是一梭子。php也有闭包,我们和js对比一下。PHP官网对闭包的解释:匿名函数(Anonymousfunctions),又称闭包函数(closures),允许临时创建一个没有指定名称的函数。最常用作回调函数(callback)参数的值。php中的闭包其实和js很像,也和函数有关。其实也是一个可以访问自由变量的函数,常用于回调函数中。值得一提的是PHP的封闭性更彻底。它不能主动访问外部变量,必须主动使用use关键字传入,而这个参数是传值的。如果要按引用传递,则必须添加&。$example=function(){var_dump($message);};$example=function()使用(&$message){var_dump($message);};你觉得php的这个设置是多余的吗?我个人认为它更安全。Golang中的闭包最近在学习go语言,我们来看看go语言中的闭包。Go的官方教程说:FunctionclosuresGo函数可能是闭包。闭包是一个函数值,它从其主体外部引用变量。该函数可以访问和分配给引用的变量;从这个意义上说,函数“绑定”到变量。例如,加法器函数返回一个闭包。每个闭包都绑定到它自己的总和变量。例子:packagemainimport"fmt"funcadder()func(int)int{sum:=0returnfunc(xint)int{sum+=xreturnsum}}funcmain(){pos,neg:=adder(),加法器()为我:=0;我<10;i++{fmt.Println(pos(i),neg(-2*i),)}}翻译:函数闭包Go函数可以形成闭包,闭包在函数体之外引用返回函数中的变量。作为值返回的函数可以访问和修改引用的变量,在这种情况下,返回的函数和函数体中的变量是相互关联的。在示例中,加法器函数返回一个闭包,每个闭包都与同一个sun变量相关联。在Go中,闭包特指函数作为值返回的情况,返回的函数是指生成它的父函数中的变量。学习了go中的闭包,感觉之前的理解好像有些问题,所以做了一些修改。评论里的一位大神总结的很好:从内存回收的角度,更容易理解闭包。正常的函数调用后,内部变量会被销毁,而闭包可以保留应该被销毁的变量。参考:不假装解释闭包-方英航