在javascript中,函数可看做是一种数据,能够赋值给变量,能够嵌套在另外一个函数中。javascript
var fun = function(){ console.log("平底斜"); }
function fun(){ var n=10; function son(){ n++; } son(); console.log(n); } fun(); //11 fun(); //11
咱们把上面第二段代码稍微修改下:java
var n=10; function fun(){ function son(){ n++; } son(); console.log(n); } fun(); //11 fun(); //12
看出差异了吗,若是理解不了代码执行结果,请看上一篇博文,关于javascript做用域和做用域链的讲解。闭包
上面这段代码中变量n是全局变量,随时可能被从新赋值,而无需经过fun函数的调用。为了让变量n不受污染,或者说是减小全局变量的污染,咱们须要把n放到函数中做为局部变量。函数
function fun(){ var n=10; function son(){ n++; console.log(n); } son(); } fun(); //11 fun(); //11
若是咱们能够在全局中直接调用son函数,那么即可以达成想要的效果。son函数如今是做为局部变量存在,要想在全局中访问,通常有两种方法:spa
一种是赋值给全局变量code
var a; function fun(){ var n=10; a = function son(){ n++; console.log(n); } } fun(); //son() a(); //11 a(); //12
另外一种是使用return返回值blog
function fun(){ var n=10; return function son(){ n++; console.log(n); } } var a=fun(); a(); //11 a(); //12
上面的son()函数就是闭包,某种意义上全部函数均可以看做闭包。闭包就是能够访问外层函数做用域的变量的函数。ip
var a; function fun(){ var n=10; a = function son(){ n++; console.log(n); } return a(); } fun(); //11 a(); //12 a(); //13 fun(); //11 a(); //12 a(); //13
仍是上面那段代码,咱们稍微修改下,再看看执行结果,这是由于每次执行fun()函数时都会初始化变量n。内存
闭包的好处是减小全局变量,避免全局污染,能够将局部变量保存在内存中。但这既是优势又是缺点,一段代码中若是闭包过多,有可能形成内存泄露。因为闭包中局部变量不会被垃圾回收机制回收,因此须要手动赋值为null(关于内存泄露,后期单独开专题)作用域