> 当一个函数可以通过某种方式访问其它函数内部变量时,闭包就形成了 你每次执行`fn1`,里面的`var n = 0`,都把`n`初始化为`0`了。 `fn`其实也遵循这个规律,函数都这样。 但是,你的`fn`在复赋值给`fn1`之后,就没有再执行了。所以里面的`num`没有被重新赋值,又由于闭包的作用让它不会被销毁(语言引擎特性),使得你在每次调用`fn1`都可以访问到它累积起来的值。 回到开头的话,你的`fun1`就有能力访问`fn`内部的`num`。也就形成了闭包。闭包的特性就使得`num`不会被销毁(因为外面有函数可能会访问`num`,不销毁才合理)。 function fn() { var num = 3; // 这里加一个console.log console.log('outer num', num); return function() { var n = 0; n++; num++; console.log('n=' + n); console.log('num=' + num); } } // 连续调用两次看看,num的表现和n是一样的 fn() fn() 附一下阮一峰的闭包文章(阮一峰,我的hero!) [学习Javascript闭包(Closure)](https://link.segmentfault.com/?enc=kXfewKEiq0D7frAtktz7Cg%3D%3D.AOfXOZ06cydaYTO9S202xFKenwwg0qDhRsdAVOg%2FvkY3pAgCd%2BR5remP%2B4RFfwtUy56zo7vZKhtL%2FGis4UnfI9S9lqvEf%2FMtiiwsYA8w%2B4w%3D)