/*闭包就是能够读取其他函数内部变量的函数, 在js中也可以简单地理解成定义在一个函数内部的函数。
在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的最大用处有两个,一个是读取函数内部的变量,另一个是让这些变量的值始终保持在内存中*/
/*function a(){
var n=0;
function inc(){
n++;
console.log(n);
}
inc();
inc();
}
a();*/
/*function a(){
var n=0;
this.inc = function(){
n++;
console.log(n);
};
}
var c = new a();
c.inc();
c.inc();*/
function
a(){
var
n =
0;
function
inc(){
n++;
console.
log(
n);
}
return
inc;
}
var
c =
a();
c();
c()
/************************************************************/
function
create_counter(
initial) {
var
x =
initial ||
0;
return {
inc:
function () {
x +=
1;
return
console.
log(
x);
}
}
}
// var c1 = create_counter();
create_counter.
inc();
// 1
create_counter.
inc();
// 2
create_counter.
inc();
// 3
var
c2 =
create_counter(
10);
c2.
inc();
// 11
c2.
inc();
// 12
c2.
inc();
// 13
/****************************************************/
'use strict';
// 定义数字0
var
zero =
function(
f){
return
function(
x){
return
x;
}
};
// 定义数字1;
var
one=
function(
f){
return
function(
x){
return
f(
x);
}
};
// 定义加法;
function
add(
n,
m){
return
function(
f){
return
function(
x){
return
m(
f)(
n(
f)(
x));
}
}
}
console.
log(
add(
one,
one));
/***********************************/
最后用‘斐波那契数列’来帮助理解闭包原理
function
fib(
max){
var
t,
a=
0,
b=
1,
arr=[
0,
1];
while(
arr.
length<
max){
t=
a+
b;
a=
b;
b=
t;
arr.
push(
t);
}
return
arr;
}
console.
log(
fib(
5));
console.
log(
fib(
10));