闭包

闭包这东西,真的是很难搞,之前也有学习,但是现在才发现自己一直理解的都是错的,所以今天我把这写难搞的例子先一个一个写出来,然后剖析其中的原理,以便于我们深一步的理解;
闭包的两大好处:
    1.可以读取函数内部的变量;
    2.可以将变量的值始终保存在内存中;

案例1:
var n = 2;

function f1(){
    alert(n);  //2
}
f1();

这个例子因为函数内部并没有定义变量n,所以体现闭包的一个特性:函数内部可以直接读取全局变量,这里n在全局已经被赋值,所以结果是2;

但是请看第二个;
案例2:
var n=2 ;

function f1(){
    alert(n);    //undefined

    var n =99;
    alert(n);    //99
}
f1();

看到相信你一定懵逼了,因为我是这样的。。。。这是之前一个面试我的大牛出的最简单的一个题目。这里解释一下为什么是undefined和99这两个结果吧,你一定会想第一个例子不是已经证明了第一个弹出的是2因为函数内部还未定义的时候函数内部可以获取到全局变量的赋值,这个想法是对的,但是在这个函数内部,因为下面定义的var n =99;已经说明这个变量在函数内部已经自己定义过了,只是这个定义是隐藏起来的,指导var n =99;又给他赋值99,才使得他有自己真正的值,在此之前他是这样的:
{
var n;    //这个在最开始是隐藏的,未定义
alert(n);   //undefined

var n =99;   //重新赋值
alert(n);        //99
}

案例3:
请看这三个例子,如果函数内定义没有加var,那么定义的就是全局函数
函数内部定义的n,外部不能够使用;
function f1(){
    var n = 9;
}
console.log(n);       // undefined

函数没有调用,所以n并没有赋值;
function f1(){
    n =9;
}
console.log(n);     // undefined


调用函数,因为函数内没有使用定义var n=9,则定义的为全局函数,所以结果为9;
function f1(){
    n =9;
}
f1();

console.log(n);     // 9


案例4:
案例 f2就是闭包函数
function f1(){
    var n=9;

     function f2(){
    console.log(n);
}

return f2;
}

var result = f1();
result();   //9

我尝试了一下直接返回f1()函数,结果是失败的;

posted @ 2016-04-28 12:15  追风筝的eva  阅读(117)  评论(0编辑  收藏  举报