JavaScript闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。就是形成一个不销毁的栈环境。
如果你要设置一个计数器,代码如下:
var counter = 0;
function add() {
return counter += 1;
}
add();
add();
add();
// 计数器现在为 3
但问题counter属于全局变量,页面上的其他脚本可以改变计数器。这样我们把它变成局部变量。
function add(){
var counter = 1;
return counter += 1;
}
add();
add();
add();
这里输出为1,并没有累计数字。
这里需要闭包,代码如下:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
案例解析
这里的案例中变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。
注意事项
1、自调用函数外部的括号是必须的,如果没有加上JavaScript无法解析为一个函数表达式的自调用;而是解析为一个函数的声明和一个圆括号,并显示语法错误——圆括号内没有有效的表达式。
2、由于自调用函数是立即执行函数,其函数名称会自动被忽略,不能使用函数名调用,所以自调用函数没必要写函数名。
网友评论