我对闭包的理解是:将函数赋值到变量上,并在不同的环境中重复使用。
这并不是严格准确的闭包定义。
闭包指的是具有引用环境访问权限的函数。在JavaScript中,这意味着一个函数由另一个函数返回,并且可以访问原始函数的作用域。其他SO问题描述了这一点得非常好
闭包是通用结构,可以以各种方式使用。它们最大的好处之一是保护私有作用域,这也是为什么像jQuery这样的库经常被编写为闭包形式,以便不需要将所有函数全局暴露。
Promise是一种不同的概念。它们是一种组织异步代码的方式,使其更易于遵循流程。特别地,promise对象是提供了按清晰易读的方式链接操作的对象。一个Promise可能使用闭包实现,但不必如此。例如,下面是一个不使用闭包的实现:
https://gist.github.com/814052/690a6b41dc8445479676b347f1ed49f4fd0b1637
而jQuery的实现使用至少一个闭包,但并不是基于它们的。
http://james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.Deferred
Promise(承诺)和Closure(闭包)不是直接相关的概念。 Closure(闭包)是一种编程技巧,可能会在Promise(承诺)的实现中使用。最终,实现Promise(承诺)并非不可能或不必像这样。
即使您用2x4制作鸟屋,您也不会问它是否是一个鸟屋。承诺和闭包也是如此。承诺利用闭包来保留对状态、回调和其他类似事物的引用。
观察绑定到集合的某种类型的所有操作(排队或未排队)何时完成
。这意味着您可以使用此对象来了解何时在一组项目的行为完成后继续进行操作。另一方面,闭包并不是 jQuery 特有的,而是一种 JavaScript 构造,将两个东西结合在一起:一个函数和创建该函数的环境
。这意味着不仅执行函数,还可以在可能完全不同的上下文中执行函数。闭包和Promise是不同的概念。闭包指的是变量的作用域,而Promise则用于“承诺”在异步操作完成时将对某个对象进行操作。由于Javascript是非阻塞的(而不是异步的--编辑),如果它需要访问互联网或磁盘,则不会等待函数获得响应,也就是说,您可以在某些操作完成后执行Promise。