闭包(计算机科学)是什么?
在The Swift programming langauge看到closures,但是不太理解是什么,有什么样的特性,能做什么Objective-C做不到的?编程初学者,求指教
回复内容:
要说 Closure 就得说 Closed Lambda Expression,一个 Closed Lambda Expression 就是没有自由变量的 Lambda Expression,如 λx. x,而 λx. yx 就不是 Closed。Closed Lambda Expression 最好的性质之一就是它的类型必然同构于某个逻辑重言式,如 λx. λy. xy 的类型就是「肯定前件」(α → β) → α → β。那么如何把某个 Open Lambda Expression 给 Enclose 住呢?答案就是把它引用的所有自由变量给保存到什么东西里面,这种保存了自由变量的 Lambda Expression 就是 Closure。在其同构的逻辑一面,则是在相继式左边加入前提。
语法上东西我就不说了。
计算机程序可以粗略的分成,代码+数据。初学者很容易就会将这两者对立起来,会认为代码就是代码,数据就是数据,两者是完全不同的。但实际上,两者可以统一起来的。将代码跟数据统一起来,是学习计算机编程的一道门槛。
可以参考,我以前的回答。回调函数是什么?
将数据保存起来,以后再使用,会觉得很自然。但将代码保持起来,以后再使用,很多人会觉得很别扭,难以理解。都是因为还没有过那道槛。
代码指令执行时候,会处于一定的环境,单纯将代码保存下来,还是不够的,需要将代码所处的环境也保存下来。闭包其实是,将代码跟代码所处于的环境做为一个整体来看待。周围的环境,表现为代码所使用的数据。在有些语言中,这个概念叫代码块(block),匿名函数(lambda)等等。
数据跟代码不再人为割裂开来,统一起来看待。闭包就会是很自然的概念。数据可以传递,从一个地方传递到另一个地方,并且以后再使用。闭包从某个角度来说,也是数据,当然也可以传递,从一个函数传递到另一个函数,也可以保持下来,以后再调用。因为将环境也保持下来了,以后调用的时候,就还原当时的情况,延迟执行,就很容易,很自然地实现了。而延迟执行有什么作用?就是另一个话题了。
function makeCounter() local count = 0 return function() count = count + 1 return count end
说的通俗一点,就是闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量。
我们用脚本语言来看一下:
<span class="kd">function</span> <span class="nx">funA</span><span class="p">(</span><span class="nx">callback</span><span class="p">){</span> <span class="nx">alert</span><span class="p">(</span><span class="nx">callback</span><span class="p">());</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">funB</span><span class="p">(){</span> <span class="kd">var</span> <span class="nx">str</span> <span class="o">=</span> <span class="s2">"Hello World"</span><span class="p">;</span> <span class="c1">// 函数funB的局部变量,函数funA的非局部变量</span> <span class="nx">funA</span><span class="err">(</span> <span class="kd">function</span><span class="err">()</span><span class="p">{</span> <span class="k">return</span> <span class="nx">str</span><span class="p">;</span> <span class="p">}</span> <span class="err">);</span> <span class="p">}</span>
这个比较容易懂 至少JavaScript闭包是指有权访问另一个函数作用域中的变量的函数,其他语言的不知道(逃 可以和对象的概念对比起来理解,简单地说:
对象是带方法的数据,而闭包是带数据的方法
后半句的数据特指外部数据 一块内存区域,存放着可执行代码和一些变量,指针 学过离散没?在某些集合上某些运算的结果始终在这个集合里,这就叫闭包性质…………虽然和这个闭包一点关系都没有=_=。
闭包在函数式语言当中是一个非常有力的工具,但是有点只可意会的感觉。
简单的来说你可以把闭包看成是绑定了某些变量的值的函数,由于函数式语言中函数是一级对象,所以,这样的性质就非常有用了,比如说可以通过在函数里面返回一些闭包来定义一些数据结构什么的。
举个栗子:
这是我学common lisp 的时候写的一个栈
<span class="p">(</span><span class="nb">defun</span> <span class="nv">stackpush</span> <span class="p">(</span><span class="nv">stack</span> <span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nb">cons</span> <span class="nf">#'</span><span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="nv">x</span><span class="p">)</span> <span class="nf">#'</span><span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="nv">stack</span><span class="p">)))</span> <span class="p">(</span><span class="nb">defun</span> <span class="nv">stackpop</span> <span class="p">(</span><span class="nv">stack</span><span class="err">)</span> <span class="p">(</span><span class="nb">apply</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">stack</span><span class="p">)</span><span class="no">nil</span><span class="p">))</span> <span class="p">(</span><span class="nb">defun</span> <span class="nv">stacktop</span> <span class="p">(</span><span class="nv">stack</span><span class="p">)</span> <span class="p">(</span><span class="nb">apply</span> <span class="p">(</span><span class="nb">car</span> <span class="nv">stack</span><span class="p">)</span> <span class="no">nil</span><span class="p">))</span>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

7月31日消息,蘋果昨天(7月30日)發布新聞稿,宣布推出新的開源Swift包(swift-homomorphic-encryption),用於在Swift程式語言中啟用同態加密。註:同態加密(HomomorphicEncryption,HE)是指滿足密文同態運算性質的加密演算法,即資料經過同態加密之後,對密文進行特定的計算,得到的密文計算結果在進行對應的同態解密後的明文等同於明文資料直接進行相同的計算,實現資料的「可算不可見」。同態加密技術可以計算加密數據,而且不會向操作過程洩漏底層的未加

如何使用MySQL在Swift中實作資料匯入和匯出功能匯入和匯出資料是許多應用程式中常見的功能之一。本文將展示在Swift語言中使用MySQL資料庫實作資料匯入和匯出的方法,並提供程式碼範例。要使用MySQL資料庫,首先需要在Swift專案中引入對應的庫檔案。你可以透過在Package.swift檔案中加入以下依賴來實現:dependencies:[

Vue.js是一種流行的JavaScript框架,用於建立使用者介面。而Swift語言是一種用於iOS和macOS應用程式開發的程式語言。在本文中,我將探討如何將Vue.js與Swift語言集成,以實現高級iOS應用程式的開發和測試。在開始之前,我們需要確保你已經安裝了以下軟體和工具:Xcode:用於開發和編譯iOS應用程式的整合開發環境。 Node.js:用於

如何使用Redis和Swift開發即時聊天功能引言:即時聊天功能已經成為現代社交應用中不可或缺的一部分。在開發社交應用程式時,我們經常需要使用即時聊天來提供用戶之間的互動和資訊交流。為了達到即時性和高可用性的要求,我們可以使用Redis和Swift來開發這樣一個功能。 Redis簡介:Redis是一個開源的記憶體資料結構儲存系統,也被稱為資料結構伺服器。它透過提供多

與Go接近的程式語言有哪些?近年來,Go語言在軟體開發領域逐漸嶄露頭角,受到越來越多開發者的青睞。雖然Go語言本身擁有簡潔、高效和並發性強的特點,但有時也會遇到一些限制和不足。因此,尋找與Go語言接近的程式語言成為了一種需求。以下將介紹一些與Go語言接近的程式語言,並透過具體程式碼範例展示它們的相似之處。 RustRust是一種系統程式語言,注重安全性和併發性

Vue.js與Swift語言的集成,實現高級iOS應用的開發和測試的建議和技術指導引言移動應用的開發和測試是一個複雜且需要專業技術的領域。兩個主要的技術堆疊分別是前端的Vue.js和iOS平台的Swift語言。本文將介紹如何將Vue.js和Swift語言進行集成,以便開發和測試高階的iOS應用。 Vue.js的基本原理和功能Vue.js是一種用來建立使用者介面的

如何使用Redis和Swift開發推薦系統功能在當今互聯網時代,推薦系統已成為許多應用的核心功能之一。無論是電商平台、社群網路或音樂影片網站,都廣泛使用推薦系統來提供個人化的推薦內容,幫助用戶發現並獲得他們可能感興趣的內容。要實現一個高效和準確的推薦系統,Redis和Swift是兩個強大的工具,可以透過它們的組合來實現一個強大的推薦功能。 Redis是一個

PHP是一種流行的伺服器端腳本語言,它廣泛用於開發網頁應用程式。 PHP可以以各種方式與Web伺服器搭配使用,包括Apache、Nginx等。在本文中,我們將重點討論PHP中的Web伺服器,其工作原理以及如何在PHP中使用Web伺服器。 Web伺服器是一種網頁應用程序,用於接收HTTP請求並發送HTTP回應。 Web伺服器也可以處理靜態檔案(如HTM
