OK,如果说到JS中的闭包,给我的感觉就是它能很好地体现出JS函数式编程的特点。
它不同于我们之前学的C,C++,JAVA中,函数只能被声明,调用,或者是类的成员方法。
在JS中,函数可以赋值给一个变量,而JS又是弱类型语言,所以在JS中函数就可以作为参数或者是返回值(这一点就是蛮好玩的)。
OK,了解了上面,我们就来看一下什么是闭包?
定义:函数嵌套函数,并且内层函数作为返回值,引用外部函数的参数或变量。
乍一看似乎不好理解,emmm,我们就通过例子来一步步理解闭包的概念。
例子一
function f1() {
var a = 0;
return function () {
return a+5;
}
}
来看一下这个简单的例子。
正好满足闭包函数的特点。
嘶,那如果我们打印一下f1(),会是什么样子呢?
var f=f1();
console.log(f);
ƒ () {
return a+5;
}
打印出来一个函数,而且正好是内层函数。
那如果我现在再打印f()呢。
console.log(f());
5
没啥毛病似乎,现在是不是有点理解闭包的意思了。
再来一张图来深刻理解一下:
例子二
function f2() {
var a = 0;
return function () {
return a++;
}
}
f=f2();
console.log(f());
console.log(f());
console.log(f());
f=f2();
console.log(f());
console.log(f());
console.log(f());
如果我们碰到这样的例子,我们记住一点,外层函数只要不被调用第二次,那么外层函数的参数或者变量的值就不会被冲刷,也就是说对于内层函数而言,外层函数的变量可以看成“全局变量”。
输出结果为:
0
1
2
0
1
2
现在我们再用图来看一下:
OK,我们再来一个例子看看应该就差不多了:
例子三
function f3() {
var a = 0;
return function () {
return ++a;
}
}
console.log(f3()());
console.log(f3()());
console.log(f3()());
如果上面两个理解了的话,这个应该也能猜出来结果吧:
1
1
1
这个例子我们直接用图解来看一下:
这个不就相当于外层函数调用了3次,所以a也被重置成0三次。
所以会输出三个1.
OK,这一篇文章主要用来理解闭包的概念。
END,结束。