javascript闭包的个人理解

来源:互联网 发布:java上传和下载文件 编辑:程序博客网 时间:2024/06/15 10:20
1、在函数内部声明变量的时候一定要用var命令。如果不用的话,实际上声明了一个全局变量。
2、在JS中,对于变量,就是内部函数可以一直向上寻找父对象变量,内部函数可以访问父函数定义的变量,但父函数不能访问子函数变量。最简单的理解就是儿子可以要父亲的,父亲要不了儿子的。
3、闭包就是为了解决上述问题的,将子函数作为父函数的返回值,这样就可以在外部读取内部变量了。
function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
4、函数体内部用var关键字定义变量,会对变量有个保护作用,这个保护的作用域限定在这个函数体内,也就是说,在这个函数体内访问这个变量,是这个值,如果没有var关键字,则定义并改变了变量的值。
function outerFun(){
var a =0;
alert(a); 
}
var a=4;
outerFun();
alert(a);
结果是 0,4 . 因为在函数内部使用了var关键字维护a的作用域在outFun()内部. 
再看下面的代码: 
Js代码 
function outerFun(){
//没有var 
a =0;
alert(a); 
}
var a=4;
outerFun();
alert(a);
结果为 0,0 真是奇怪,为什么呢? 
作用域链是描述一种路径的术语,沿着该路径可以确定变量的值.当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4; 并改变其值.
原创粉丝点击