2013-01-24_133245

截自:http://coolshell.cn/articles/6731.html

2013-01-24_133156

截自:https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures#Creating_closures_in_loops_A_common_mistake

同样是循环中赋值函数,MDN解释中说“创建了三个闭包”而酷壳的文章说“绑定了同一个闭包”。

结合上下文,前者解释为三个闭包共享同一环境,而后者解释为三个函数绑定同一闭包。

前者所谓闭包=后者所谓函数,后者所谓闭包=前者所谓环境(作用域里的变量)。

再看看维基百科的说法

闭包Closure)是词法闭包Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

这样就比较明白了,闭包既包括函数也包括环境,所以两篇文章中的提法虽然貌似矛盾,其实也都是没错的。