1. 程式人生 > >閉包函式&回撥函式

閉包函式&回撥函式

閉包函式&回撥函式

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