今天学习的概念是闭包
一般的计数器需要借助全局变量
var counter = 0; //全局变量
function add() {
return counter += 1;
}
add();
add();
add();
结果是3
然而这样做有一个特别大的缺点,即因为全局变量是每个方法里都可以调用,所以可能产生不确定的变化,有什么方法可以避免呢?那就要用到闭包了
闭包长什么样?下面是一个闭包计数器,每执行一次add(),且只有执行add()才会计数,且步长是1
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
计数器受匿名函数的作用域保护,只能通过 add 方法修改。
函数的返回值是函数,因为嵌套函数的特点是,自函数可以调用父函数的局部变量,所以闭包就有下面两个用处:
1.读取函数内部的变量;
2.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
另外注意:闭包的返回函数不要引用任何循环变量,或者后续会发生变化的变量。
此外:
闭包返回值是函数原型,所以具有延迟执行的特点。
闭包还可以把多参数的函数变成单参数的函数。
网友评论