关于promise内存泄漏的问题

如果promise对象接受的函数没有传入resolve和reject两个参数,会发生内存泄漏吗?

当一个 promise 无法 resolve 也无法 reject 的时候,就会发生内存泄漏。

和具体的事件循环实现有关,通常一个正常实现的事件循环,应该只有在callback进入待执行队列,或者注册了系统级别的回调(如定时器setTimeout,或者是网络之类的IO操作)的情况下会保留对callback的引用,其它时候callback其实只被将来有可能调用callback的代码本身引用,事件循环是不管的。promise的resolve和reject方法也只是这些callback中的一个。通常来说js的promise其实是两部分组成,一部分是创建后立即被延迟执行得一个回调,另一个是resolve/reject方法和背后关联的一套回调管理机制,它们在resolve/reject被调用后按照预设的逻辑将then方法保存的回调函数依次进行延迟执行。前者通过参数保存了resolve/reject方法的引用,可想而知这两个方法内部引用了promise对象以及后续的回调。但如果创建promise后立即执行的回调函数执行结束后,没有调用promise/reject,也没有将它传递给其它对象,那就没有人继续保有对promise/reject的引用,如果事件循环设计符合前面说的特性,那此时整个promise对象就可以被回收。但如果事件循环因为各种原因内部保存了未resolve的promise的引用,那自然就会内存泄露了。