闭包函数&回调函数

谈到回调函数,不得不提匿名函数;匿名函数,也叫闭包函数,也就是没有名字的函数,它可以单独存在,也可以将其赋值给某一个变量.so,先来看一下闭包函数。

闭包函数

php文档:

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

JS文档:

Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相应的函数来指代这些作用域。(可以访问独立数据的函数)。

闭包是一个函数和声明该函数的词法环境的组合。从理论角度来说,所有函数都是闭包。

为什么要用闭包?

闭包有一个特点,内部函数可以引用外部函数的参数和变量,参数和变量就不会被收回。

环境被保存下来。

<?php
$add = function() {
$sum = 0;
return function() use (&$sum): int {
$sum += 1;
return $sum;
};
};
$test = $add();
echo $test(), "\n"; // 1
echo $test(), "\n"; // 2

一般函数局部变量无法长久地保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久地保存变量又不会造成全局污染。

回调函数

手册里有一个解释,一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数.回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法.

我所理解的是如果函数A调用函数B,此时函数B就扮演了回调函数的角色;反之,函数A扮演回调函数的角色.

回调函数可以由普通函数来扮演,也可以由上文提到的匿名函数来扮演.

为什么要用回调?
.
.
.
public function index()
{
return Admin::content(function (Content $content) {
// 页面标题
$content->header('用户列表');
$content->body($this->grid());
});
}
protected function grid()
{
// 根据回调函数,在页面上用表格的形式展示用户记录
return Admin::grid(User::class, function (Grid $grid) {
$grid->id('ID')->sortable();
$grid->name('用户名');
$grid->email('邮箱');
$grid->email_verified('已验证邮箱')->display(function ($value) {
return $value ? '是' : '否';
});
}
}
.
.
.

Admin::content() 会根据回调函数来渲染页面,它会自动渲染页面顶部、菜单、底部等公共元素。

用回调函数获取需要显示的数据,然后通过调用 $content 的方法在页面上添加元素来设置不同页面的内容。

如这边就是把回调得数据内容放置在body中,若不用回调函数,则需要把放置的位置等直接写入grid(),一个是提高耦合,另一个是不规范。


理解转自下面三个地址的详解

https://laravel-china.org/articles/7469/learn-the-closure-function-closures

https://laravel-china.org/articles/18671

https://laravel-china.org/courses/laravel-shop/5.5/user-list/1588

闭包函数&回调函数的更多相关文章

  1. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  2. js、匿名函数、闭包、回调函数

    234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...

  3. (60)Wangdao.com第十天_JavaScript 函数_作用域_闭包_IIFE_回调函数_eval

    函数        实现特定功能的 n 条语句封装体. 1. 创建一个函数对象 var myFunc = new Function(); // typeof myFunc 将会打印 function ...

  4. 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】

    一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...

  5. jquery 中的回调函数,回调函数(callback)是什么?

    知乎上果然大牛比较多 大神解释如下: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里, ...

  6. node.js中的匿名函数, 回调函数和嵌套函数

    定义一个函数相信大家已经很熟悉了, 在javascript里的函数也是非常重要的, 使用率非常高, 有几种函数不是很好理解 一, 匿名函数 var remove = function(num1) { ...

  7. 【js】利用闭包消除回调函数启动时值已经发生变化的影响

    在以下代码中,timeFun异步执行了一个匿名函数,当输出color的值时已经由green变成red,因此输出为red. function timedFun(callback){ setTimeout ...

  8. 函数&回调函数&匿名函数&自调函数

  9. javascript回调函数,闭包作用域,call,apply函数解决this的作用域问题

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

随机推荐

  1. linux配置jdk环境变量

    首先在Linux解压后缀为.tar.gz的jdk压缩文件 解压到当前的文件夹 tar -zcvf /root/java/jdk版本编号 指令: cd 目录路径     -> 是进入该目录路径 c ...

  2. PHP 扩展管理

    一直对 PHP 扩展了解的似是而非,每次安装扩展都要百度教程,很容易出现各种错误.所幸整理下管理扩展的所有操作,方便日后操作. 查看已加载的扩展 输出 phpinfo(): 使用 get_loaded ...

  3. JVM基础系列第1讲:Java 语言的前世今生

    Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大.虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统.大到国际电商巨头阿 ...

  4. EF下lambda与linq查询&&扩展方法

    1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from ...

  5. 安装wamp环境 最新完整版

    Apache 下载地址:https://www.apachehaus.com/cgi-bin/download.plx 下载后 解压目录 放到C:/Program Files下面目录重命名为Apach ...

  6. 从SQL Server CloudDBA 看云数据库智能化

    最近阿里云数据库SQL Server在控制台推出了CloudDBA服务,重点解决数据库性能优化领域问题,帮助客户更好的使用好RDS数据库,这是继MySQL之后第二个关系型数据库提供类似的服务.   数 ...

  7. REST API设计指导——译自Microsoft REST API Guidelines(四)

    前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...

  8. webpack4.0各个击破(9)—— karma篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  9. nginx基础

    常见的能够提供web服务的程序有apache.IIS,nginx等,LLS是windows系统中的,nginx和apache是linux系统中的,nginx是一款高性能的http和反向代理的服务器. ...

  10. C#工具:ASP.NET MVC生成图片验证码

    1.复制下列代码,拷贝到控制器中. #region 生成验证码图片 // [OutputCache(Location = OutputCacheLocation.None, Duration = 0, ...