闭包

闭包

在前面,我们说到让函数作为返回值的时候,写了这么一个例子。

1
2
3
4
5
6
7
8
9
10

function lazy_sum(arr) {
var sum = function(){
arr.reduce(function(x,y){
return x+y
})
}
return sum;
}

闭包是函数运行时候的一种封闭环境,每一个函数都有。讲闭包首先要讲到作用域,比如我们写一个函数,函数内部的变量是没法被函数外部捕获到的,那么如果说,我们在A函数里边定义一个计数器变量,在该函数外部调用,可能就会出现意想不到的错误。但是,很多时候,我们又有这样的需求,那么怎么样,突破闭包呢?

1
2
3
4
5
6
7
8
9
function h() {
var age = 11;
return function() {
return age;
}
}

var tmp = h();
console.log(tmp()); //11

在这个例子里,我们h函数里面,声明了一个变量,该变量是不能被外部访问的,但是,我们 return 的函数,却可以访问外层作用域的变量值,那么如果我们把子函数当作返回值,返给调用的函数,不久突破了闭包吗?

闭包计数器
1
2
3
4
5
6
7
8
9
10
11
12
var cnt = (function(){
var num = 1;
return function() {
return num++;
}
})();

console.log( cnt() ); //1
console.log( cnt() ); //2
console.log( cnt() ); //3