簡體   English   中英

承諾關閉?

[英]Is promise a closure?

閉包標簽維基頁面中 ,它顯示“jQuery本身就是一個大關閉”。

但是也承諾關閉? 你能解釋一下為什么或為什么不解釋? 這就是我理解閉包的方法:為變量分配一個函數並在不同的環境中重用它。 Promise使用$.ajax()來做,但我無法在stackoverflow中找到將promise作為閉包引入的地方。 也許是因為還有其他的承諾功能,如$.Deferred()resolve()fail()以擴展其功能,超越簡單的函數傳遞?

關閉

這就是我理解閉包的方法:為變量分配一個函數並在不同的環境中重用它。

這不是一個嚴格准確的閉包定義。

閉包是一種可以訪問引用環境的函數。 在Javascript中,這意味着由另一個函數返回的函數,並且可以訪問原始函數作用域。 還有其他SO問題很好地描述了這一點

閉包是可以以各種方式使用的通用結構。 它們最大的好處之一是它們保護私有范圍,這就是為什么像jQuery這樣的庫通常被編寫為閉包,因此它們不需要在全局公開它們的所有功能。

承諾

承諾是一個不同的概念。 它們是構造異步代碼的一種方式,可以更容易地遵循流程。 特別是promise對象是一個以清晰易讀的方式為鏈操作提供函數的對象。 可以使用閉包實現承諾,但不一定如此。 例如,這里是一個不使用閉包的實現:

https://gist.github.com/814052/690a6b41dc8445479676b347f1ed49f4fd0b1637

而jQuery的實現使用至少一個閉包,但實際上不是基於它們

http://james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.Deferred

結論

承諾和閉包不是直接相關的概念。 Closure是一種可以在Promise實現中使用的編程技術。 最終,既不是不可能也不是必須這樣實現它。

你不會問一個鳥舍是否是2x4,即使你用它來做它。 承諾和封閉也是如此。 Promise使用閉包來保留對state,callbacks和其他類似東西的引用。

由於JavaScript的本質,即異步,我們通過語言和運行時提供了很多功能。 首先,jQuery中的Promise雖然不是jQuery獨有的,但它是一個對象,它將隨着文檔的說明, observe when all actions of a certain type bound to the collection, queued or not, have finished 這意味着您可以使用此對象知道在一組或一組項目完成某些行為后何時繼續。 現在, Closure並不是jQuery獨有的,而是一個JavaScript構造,它combines two things: a function, and the environment in which that function was created 這意味着不僅執行一個函數,而且可能在完全不同的上下文中執行。

閉包和承諾是不同的概念。 閉包是指變量的范圍,其中承諾用於“承諾”在異步操作完成時對某事件的行為將發生。 由於Javascript是非阻塞的(不是異步的 - 編輯),它不會等待函數獲得響應,如果它需要訪問互聯網或磁盤,它表示你可以在完成任務后執行一個承諾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM