在closure tag wiki page中,它写着“jQuery本身就是一个大关闭”。
但也承诺关闭?你能解释一下为什么或为什么不解释?这就是我理解闭包的方法:为变量分配一个函数并在不同的环境中重用它。 Promise使用$.ajax()
执行此操作,但我无法在stackoverflow中找到将promise作为闭包引入的任何位置。也许是因为还有其他承诺功能,例如$.Deferred()
,resolve()
和fail()
,可以将其功能扩展到简单的函数传递之外?
答案 0 :(得分:10)
这就是我理解闭包的方法:为变量分配一个函数并在不同的环境中重用它。
这不是一个严格准确的闭包定义。
闭包是一种可以访问引用环境的函数。在Javascript中,这意味着由另一个函数返回的函数,并且可以访问原始函数作用域。 there are other SO questions that describe this very well
Closure是可以以各种方式使用的通用结构。它们最大的好处之一是它们保护私有范围,这就是为什么像jQuery这样的库通常被编写为闭包,因此它们不需要在全局公开它们的所有功能。
承诺是一个不同的概念。它们是构造异步代码的一种方式,可以更容易地遵循流程。特别是promise对象是一个以清晰易读的方式为链操作提供函数的对象。可以使用闭包实现承诺,但不一定如此。例如,这里是一个不使用闭包的实现:
https://gist.github.com/814052/690a6b41dc8445479676b347f1ed49f4fd0b1637
虽然jQuery的实现使用至少一个闭包,但实际上不是基于它们
http://james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.Deferred
Promises和Closures不是直接相关的概念。 Closure是一种可以在Promise实现中使用的编程技术。最终,这样做既不是不可能也不是必要的。
答案 1 :(得分:6)
你不会问一个鸟舍是不是2x4,即使你用它来做它。承诺和封闭也是如此。 Promise使用闭包来保留对state,callbacks和其他类似东西的引用。
答案 2 :(得分:5)
由于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
。这意味着不仅要执行一个函数,而且可能在完全不同的上下文中执行。
答案 3 :(得分:1)
闭包和承诺是不同的概念。闭包是指变量的范围,其中承诺用于“承诺”在异步操作完成时对某事件的行为将发生。由于Javascript是非阻塞的(不是异步的 - 编辑),它不会等待函数获得响应,如果它需要访问互联网或磁盘,它表示你可以在完成任务后执行承诺。