什么是闭包? 何时用闭包
通俗的讲,闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。
下面我们使用一个计数器实例说明 闭包的使用场景。以下用 js 代码演示
1. 使用全局变量;有安全隐患
// 初始化计数器 var counter = 0; // 递增计数器的函数 function add() { counter += 1; } // 调用三次 add() add(); add(); add(); // 此时计数器应该是 3
任何代码都可以更改计数器 counter,而无需调用 add()。
2. 使用局部变量;不能累加
// 递增计数器的函数 function add() { var counter = 0; counter += 1; return counter; } // 调用三次 add() add(); add(); add(); //此时计数器应该是 3。但它是 1。
每次调用都是 单独 的,counter 都被重置,所以不能起到累加的作用。
3. 解决变量问题:嵌套函数(保护变量)
嵌套函数可以访问其上层函数的作用域。
function add() { var counter = 0; function plus() {counter += 1;} plus(); return counter; }
在本例中,内部函数 plus() 可以访问父函数中的 counter 计数器变量,并且 counter 不是全局的,其他函数不能访问到它。
3. 闭包的引出
上例中,如果我们能够从外面访问 plus() 函数。且找到只执行一次 counter = 0 的方法,就完美的解决了计数器问题。dengdengdeng~闭包登场。
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add();
我们定义一个自调用函数,它只运行一次;它初始化了计数器
然后它返回函数表达式。这样 add 成为了函数变量,并且 add 是可以访问 父作用域的 counter 的。
0顶
0 踩
共 0 条评论