闭包函数&回调函数

闭包函数&回调函数

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

闭包函数

php文档:laravel

匿名函数(Anonymous functions),也叫闭包函数(closures),容许 临时建立一个没有指定名称的函数。最常常用做回调函数(callback)参数的值。固然,也有其它应用的状况。
JS文档:
Closures (闭包)是使用被做用域封闭的变量,函数,闭包等执行的一个函数的做用域。一般咱们用和其相应的函数来指代这些做用域。(能够访问独立数据的函数)。闭包

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

为何要用闭包?

闭包有一个特色,内部函数能够引用外部函数的参数和变量,参数和变量就不会被收回。
环境被保存下来。this

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

通常函数局部变量没法长久地保存,而全局变量可能形成变量污染,因此咱们但愿有一种机制既能够长久地保存变量又不会形成全局污染。.net

回调函数

手册里有一个解释,一些函数如 call_user_func() 或 usort() 能够接受用户自定义的回调函数做为参数.回调函数不止能够是简单函数,还能够是对象的方法,包括静态类方法.
我所理解的是若是函数A调用函数B,此时函数B就扮演了回调函数的角色;反之,函数A扮演回调函数的角色.
回调函数能够由普通函数来扮演,也能够由上文提到的匿名函数来扮演.code

为何要用回调?
.
.
.
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作用域

相关文章
相关标签/搜索