闭包函数&回调函数

闭包函数&回调函数

谈到回调函数,不得不提匿名函数;匿名函数,也叫闭包函数,也就是没有名字的函数,它可以单独存在,也可以将其赋值给某一个变量.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

猜你喜欢

转载自www.cnblogs.com/shine-c/p/10155093.html
今日推荐