闭包:
介绍闭包概念的文章很多了,这里我们来谈谈闭包的使用场景:先设想这样一个场景,一款FPS游戏,玩家携带的子弹上限是一定的,这时为了能在别的地方修改弹药数量,就需要将弹药数量定义为一个全局变量,然而这样不利于控制,如果不小心把它改成-1了呢?所以我们这是就需要使用闭包来就行改变和查询弹药数:
function 枪械() { var 弹药数量 = 30; window.射击 = function () { if(弹药数量 > 0){ 弹药数量--; } }; window.装弹 = function () { 弹药数量 = 30; }; window.弹药数 = function () { console.log(弹药数量); } } window.射击(); window.射击(); window.弹药数();//28 window.装弹();这里为了代码清晰使用了中文变量名~在其他作用域内可以通过“装弹”和“射击”的方法来改变枪械的弹药数量,但没有办法直接修改“弹药数量”的数值。
在以前的代码中方法调用完成之后,执行上下文环境就会被销毁,在例子的闭包中因为“枪械”方法的“弹药数量”变量会在“装弹”方法中使用所以其执行上下文环境不能被销毁,会占用内存,所以要善用闭包。