閉包函數&回調函數

閉包函數&回調函數

談到回調函數,不得不提匿名函數;匿名函數,也叫閉包函數,也就是沒有名字的函數,它能夠單獨存在,也能夠將其賦值給某一個變量.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作用域

相關文章
相關標籤/搜索