閉包這個詞大家都不陌生,尤其是做spark的同學,經常會看到,但是很多人還是對閉包比較懵懂,就像前面說的watermark一樣,大家都很熟悉朗朗上口,但是又貌似一頭霧水沒有理解。

不懂watermark?來吧~那麼,浪尖今天就說說閉包~

首先給出浪尖理解的定義吧:

「函數」和「函數內部能訪問到的變數」(也叫環境)的總和,就是一個閉包。按照這個定義呢?下面就應該是一個閉包:

var factor = 3
val adder = (i:Int) => i * factor

可能會有同學有疑問:浪尖,這不對啊?我看網上說的閉包構造是:

閉包首先有函數嵌套,內部函數引用外部函數的變數,然後返回的是一個函數。

應該是這個樣子的:

object closure {
def main(args: Array[String]): Unit = {
println(makeAdd()(1))
}
def makeAdd() = {
val more = 10
(x: Int) => x + more
}
}

為啥要用函數嵌套?

需要外部函數的作用主要是隱藏變數,限制變數作用的範圍。有些人看到「閉包」這個名字,就一定覺得要用什麼包起來纔行。其實這是翻譯問題,閉包的原文是 Closure,跟「包」沒有任何關係。所以函數套函數只是為了造出一個局部變數,跟閉包無關。

為啥要return函數呢?

很明顯,不return函數無法使用閉包~~那麼現在換個腦子吧,我們將more 變成makeAdd的參數,那麼就是下面的形式:def makeAdd(more : Int) = (x: Int) => x + more請問這種結構看著眼熟麼?歡迎留言~

490+球友~
推薦閱讀:
相關文章