摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。
本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、java、c++等各種編程語言里都有閉包,而且大體意思是差不多的。
js里的閉包比較權威的高程里是這樣解釋閉包的:
閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另
一個函數。
當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。現在看來感覺有點問題,不知道是不是翻譯的問題,全局作用域下的函數不也是閉包嗎?
再看下mdn的解釋:
Closures (閉包)是使用被作用域封閉的變量,函數,閉包等執行的一個函數的作用域。通常我們用和其相應的函數來指代這些作用域。(可以訪問獨立數據的函數)
這是啥, 一臉懵逼。
個人理解:閉包就是一個函數,它引用了外部變量,有這兩個條件就形成了閉包
在我們日常使用中,外部變量很少是全局變量,經常是用一個母函數return一個子函數,子函數引用母函數中的變量。這個病了因為被引用了,所以母函數執行完它并沒有被銷毀,成為了自由變量。
php里的閉包最近不滿足于只干前端的活,開始用起了php。php不愧是最好的語言,抄起來就是一梭子。php里也有閉包,下面對比著js來看一下。
php官網對閉包的解釋:
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。
php里的閉包和js其實很像啊,也是和函數有關,其實也是能訪問自由變量的函數,常用在回調函數。值得一題的是php的閉包閉的更徹底,他不能主動訪問外部變量,而是要主動用use關鍵詞傳進去,而且這個傳參還是值傳遞,如果想引用傳遞還得加上&。
$example = function () { var_dump($message); }; $example = function () use (&$message) { var_dump($message); };
各位覺得php這個設定是多此一舉嗎?個人覺得這樣更保險啊。
Golang里的閉包最近在學習go語言,讓我們來看一下go語言里的閉包。
go的官方教程里如此寫道:
Function closures
Go functions may be closures. A closure is a function value that references variables from outside its body. The function may access and assign to the referenced variables; in this sense the function is "bound" to the variables.
For example, the adder function returns a closure. Each closure is bound to its own sum variable.
例子:
package main import "fmt" func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) } }
翻譯一下:
函數閉包
go中函數可以形成閉包,閉包是返回的函數在函數體外仍引用了其中的變量。作為值返回的函數可以訪問和修改引用的變量,在這種情況下,返回的函數和函數體中的變量相互關聯。
例子中,adder函數返回一個閉包,每個閉包就與同一個sun變量有關聯。
在go中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。
學習了go里的閉包我感覺自己前面的理解似乎有些問題,所以做了一些修改。
評論里一位大神總結的非常好:
從內存回收角度考慮更容易理解閉包,正常函數調用完后內部的變量就會銷毀,但閉包卻能使本該銷毀的變量一直保留。
reference:
不裝逼地解釋閉包-方應杭
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25923.html
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。 本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、...
摘要:下面讓我們來看一個例子上面就是一個最簡單的閉包。閉包的作用接下來來談談閉包的作用,初學者剛接觸時肯定是一臉懵逼,閉包的用處究竟是什么,下面就來談一談。同時也得感謝參考文章閉包的應用讓你分分鐘理解閉包閉包,懂不懂由你,反正我是懂了 昨天在看思否時,發現了一篇文章是關于JavaScript如何實現重載的,由于以前也和學長討論過JavaScript是否能夠重載,就點進去看了看,發現里面的兩個...
摘要:什么是閉包定義我所理解的閉包就是,即使外部函數已經運行完畢,內部函數仍能訪問外部函數的作用域中的變量。閉包的應用場景私有變量模塊需求只能通過函數提供的方法訪問函數內部的變量隱藏。為什么閉包很重要參考資料征服面試什么是閉包 1. 什么是閉包 MDN定義:Closures are functions that refer to independent (free) variables (v...
摘要:閉包閉包是什么閉包和匿名函數在中被引入。可以將匿名函數和閉包視作相同的概念。閉包和字符串或整數一樣,是一等值類型。何時使用我們通常把閉包當做函數和方法的回調使用。 閉包 閉包是什么? 1).閉包和匿名函數在PHP5.3中被引入。2).閉包是指在創建時封裝函數周圍狀態的函數,即使閉包所在的環境不存在了,閉包封裝的狀態依然存在,這一點和Javascript的閉包特性很相似。3).匿名函數就...
摘要:閉包是這門語言中有些復雜并且充滿誤解的特性。說明返回了內部方法,調用了的參數,閉包創建。過度使用閉包會導致腳本執行變慢并消耗額外內存。本節我們說幾種場景要注意避免閉包的產生。循環中循環中創建出閉包會導致結果異常。 譯者:閉包都被討論爛了,不理解閉包都不好意思說自己會js,但我看到這篇文章還是感覺眼前一亮,也讓我對閉包有了一些新的理解,并且涉及了一些類和原型鏈的知識,這是一篇2012年的...
閱讀 3479·2023-04-25 22:45
閱讀 1282·2021-11-11 16:54
閱讀 2790·2019-08-30 15:44
閱讀 3190·2019-08-30 15:44
閱讀 1646·2019-08-30 13:55
閱讀 941·2019-08-29 18:45
閱讀 1195·2019-08-29 17:25
閱讀 1007·2019-08-29 12:59