js 函数闭包
经典案例
function fisrtFn(){
var a = 123
function twoFn(){
var b = 456
console.log(a)
}
return twoFn
}
var fa = fisrtFn()
fa()
闭包函数 的包含关系 作用域套作用域 在调用外层函数声明的局部变量时 在函数再次调用时函数调用的变量不是 初值 是改变过后的值 有点全局变量的意思 但是确实是局部变量 的声明方式 要注意
函数能够持久保存自己定义时的所处环境,并且即使自己在其他的环境被调用的时候,依然可以访问自己定义时所处环境的值。
一个函数可以把它自己内部的语句,和自己声明时所处的作用域一起封装成了一个密闭环境,我们称为“闭包” (Closures)。
每个函数都是闭包,每个函数天生都能够记忆自己定义时所处的作用域环境。但是,我们必须将这个函数,挪到别的作用域,才能更好的观察闭包。这样才能实验它有没有把作用域给“记住”。
我们发现,把一个函数从它定义的那个作用域,挪走,运行。嘿,这个函数居然能够记忆住定义时的那个作用域。不管函数走到哪里,定义时的作用域就带到了哪里。这就是闭包。
闭包在工作中是一个用来防止产生隐患的事情,而不是加以利用的性质。
闭包的性质
每次重新引用函数的时候,闭包是全新的。
function outer(){
var count = 0;
function inner(){
count++;
console.log(count);
}
return inner;
}
var inn1 = outer();
var inn2 = outer();
inn1(); //1
inn1(); //2
inn1(); //3
inn1(); //4
inn2(); //1
inn2(); //2
inn1(); //5
不会因为再次调用而发生初始化的情况 (不是道和构造函数有什么关系 等研究一下 有点那个味了)