來源:互聯網
上載者:User
關鍵字
php
javascript
closure
閉包
匿名函數
如何通俗的解釋以下閉包(closure)和閉包在具體項目中的應用執行個體?
php中,
function demo(){ $a=10; $b=20; $fun=function() use ($a,$b){ echo $a+$b; };}demo();
是否和下面作用類似?
class cls{ public $a=10; public $b=20; public function fun(){ echo $this->a+$this->b; }}$obj=new cls;$obj->fun();
一般會在具體項目中什麼情況下使用?能否給出小例子
回複內容:
如何通俗的解釋以下閉包(closure)和閉包在具體項目中的應用執行個體?
php中,
function demo(){ $a=10; $b=20; $fun=function() use ($a,$b){ echo $a+$b; };}demo();
是否和下面作用類似?
class cls{ public $a=10; public $b=20; public function fun(){ echo $this->a+$this->b; }}$obj=new cls;$obj->fun();
一般會在具體項目中什麼情況下使用?能否給出小例子
public 改成 private 就差不多了。
閉包是函數式編程裡面的概念,隨著電腦語言慢慢朝著函數式程式設計語言的的方向發展,很對語言裡都開始支援匿名函數(以及lamada運算式)以及包。匿名函數用途很大,閉包算是為支援 lamada 運算式而存在的。
可是像,Java等這樣的語言,大家給習慣用類寫原來的代碼,在這裡面我覺得使用閉包的話,可以減小代碼量,就這樣!
前幾天,寫過一個關於閉包的草稿,js的
https://segmentfault.com/q/1010000004736461
物件導向進價之函數對象,函數對象又涉及到函數範圍傳遞,閉包簡單從字面上可以理解為封閉範圍打包傳遞。一般的函數返回後函數範圍(函數棧記憶體)消亡,函數調用時產生函數範圍(函數空間入棧)。而閉包產生函數在返回時消亡自身範圍同時又產生新的範圍,新範圍不進棧,造成棧從平級關係出現層次化關係。比如a(普通)函數調用b(閉包產生)函數,b返回c(閉包)函數,函數棧底部是a的範圍,上面是b的範圍,b函數返回,b出棧只剩a,產生的c函數範圍被傳遞到a範圍裡面,出現a範圍包含c範圍,而c的範圍是從b繼承(複製)的,就好像b範圍沒有消亡一樣。