认识理解JavaScript闭包
要理解闭包,首先必须理解Javascript特殊的变量作用域,因为闭包就是变量作用域的一些问题。
1.变量的作用域
变量的作用域的话就分为两种:全局变量和局部变量
第一种:JavaScript中的函数内部可以直接读取全局变量
var n='hello';
function fn(){
alert(n);
}
fn(); // hello
第二种:JavaScript中的外部无法获取函数内部的变量
function fn(){
var n='hello';
}
alert(n);//n is not defined
函数内部的变量一定记得用var 或者let 声明,否则就是一个全局变量
function fn(){
n='hello';
}
fn()
alert(n);//hello
2.如何从外部获取函数内部的变量?
上面说了函数内可以访问全局变量,如果在函数a内再定义一个函数b,那么函数a内的变量相对于函数b来说就是一个全局变量。
在函数内部在定义一个函数
function a(){
var n='hello';
function b(){
alert(n); // hello
}
}
如上面代码所示函数a的内部变量相对于函数b来说都是可见的,是因为JavaScript的链式作用域,自己对象会一级一级向上查找所有父级是否有对应的变量。
我们是可以拿得到变量,只需要把拿到变量的那个内部函数返回就可以了。
返回内部函数
function a(){
var n='hello';
function b(){
alert(n); // hello
}
return b
}
var result=a();
result()//hello
上面的代码b函数就是闭包
3.闭包的用途
一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
4.使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。