14

闭包标签 wiki 页面中,它显示“jQuery 本身就是一个大闭包”。

但是 promise 也可以关闭吗?你能解释一下为什么或为什么不吗?这就是我对闭包的理解:将函数分配给变量并在不同的环境中重用它。Promise 可以做到这一点$.ajax(),但我无法在 stackoverflow 中找到将 Promise 作为闭包引入的任何地方。也许是因为 Promise 还有其他一些特性,比如$.Deferred(),resolve()和 ,fail()以便将其功能扩展到简单的函数传递之外?

4

4 回答 4

16

闭包

这就是我对闭包的理解:将函数分配给变量并在不同的环境中重用它。

这不是对闭包的严格准确定义。

闭包是可以访问引用环境的函数。在 Javascript 中,这意味着一个函数由另一个函数返回并且可以访问原始函数范围。还有其他一些问题很好地描述了这一点

闭包是可以以多种方式使用的通用结构。它们最大的好处之一是它们保护私有范围,这就是为什么像 jQuery 这样的库经常被写成闭包,这样它们就不需要在全局范围内公开它们的所有函数。

承诺

承诺是一个不同的概念。它们是一种结构化异步代码的方式,可以更容易地遵循流程。特别是 Promise 对象是一个对象,它以清晰易读的方式提供链接操作的功能。一个promise可以使用闭包来实现,但不是必须的。例如,这是一个不使用闭包的实现:

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

而 jQuery 的实现至少使用了一个闭包,但并不是真正基于它们

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

结论

Promise 和 Closures 不是直接相关的概念。闭包是一种可以在 Promise 实现中使用的编程技术。最后,这样实现它既不是不可能也不是必要的。

于 2013-08-27T17:51:45.337 回答
6

你不会问鸟舍是否是 2x4 的,即使你用一个来制作它。承诺和闭包也是如此。Promise 使用闭包来保留对状态、回调和其他类似事物的引用。

于 2013-08-27T17:51:28.110 回答
5

由于 JavaScript 的性质,即是异步的,我们通过该语言及其运行时提供了强大的功能。首先,PromisejQuery 中的 a 虽然不是 jQuery 独有的,但正如文档所说,它是一个对象,observe when all actions of a certain type bound to the collection, queued or not, have finished. 这意味着您可以使用此对象来了解在一组或一组项目完成某些行为后何时继续。Closure另一方面,现在 a不是 jQuery 独有的,而是一个 JavaScript 构造,一个combines two things: a function, and the environment in which that function was created. 这意味着不仅要执行一个函数,还要在可能完全不同的上下文中执行此操作。

于 2013-08-27T17:43:31.143 回答
2

闭包和承诺是不同的概念。闭包是指变量的范围,其中承诺用于“承诺”在异步操作上完成某事时将发生某事。由于 Javascript 是非阻塞的(不是异步的 --edit),如果它需要访问 Internet 或磁盘,它不会等待函数获得响应,这表示您可以在完成某事后执行 promise。

于 2013-08-27T17:45:21.350 回答