闭包函数&回调函数

谈到回调函数,不得不提匿名函数;匿名函数,也叫闭包函数,也就是没有名字的函数,它可以单独存在,也可以将其赋值给某一个变量.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. iOS应用文件夹
  2. ubuntu14 opencv python 安装
  3. HTTP协议详解(真的很经典)
  4. D3.js 更自由的条形图
  5. 关于delphi 中 Sender的学习
  6. 【BZOJ】1090: [SCOI2003]字符串折叠(dp)
  7. Hadoop学习笔记1---简介 优点 架构分析
  8. Problem:Minesweeper Master
  9. firebug加载不了js脚本文件问题
  10. NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
  11. easyui datagrid datagrid-filter bug
  12. 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别
  13. Asp.Net 常用工具类之Office-文档操作(6)
  14. javamail 邮件格式再优化(由详情——&gt;改为统计)
  15. Office 365也是.NET Core应用开发新战场
  16. JDK源码分析(8)之 Reference 完全解读
  17. 腾讯地图api 地址解析 js版
  18. NET Core 1.1中使用Jwt
  19. CentOS之Shell文件编写基础
  20. es6函数的新语法

热门文章

  1. 对vue源码的初步认识和理解
  2. CompletableFuture基本用法
  3. Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据
  4. [转载] Relearning to Learn - 学会学习
  5. LinkedHashMap为什么是有序的(与put先后顺序一致)
  6. 安装wamp环境 最新完整版
  7. ASP.NET Core 框架源码地址
  8. Hbase给初学者的“下马威”
  9. Thread之九:stop
  10. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义