函数之闭包

来源:互联网 发布:飞机模拟驾驶软件 编辑:程序博客网 时间:2024/06/05 08:33

申明:个人理解,欢迎大神指正。


通俗解释:一个函数能使用另外一个函数里的变量就可称之为闭包,比如小明兜里有50元,小华兜里也有50元,但小华能使用小明兜里的50元。


下面看一下例子:

var name = 'xiao A';var  obj = {     name:'xiao B',     getName:function(){        return function(){           return this.name;        }     }};alert(obj.getName()());

猜一下,会弹出什么样的结果?答案是会弹出 ‘xiao A’,为什么?
可能 obj.getName()()这样的写法你不是很理解,但是如果你alert(obj.getName())你会发现弹出的是一个函数:



比如我申明一个变量 var f = obj.getName();然后再去alert(f);

这个函数的作用域是全局的 然后再去alert(f()),返回的return this.name,这个this显然会去它的平级或者上级去找,所以会弹出‘xiao A’,那么怎样会弹出‘xiao B’呢? 看着只需要加一行代码如下:

var name = 'xiao A';var  obj = {//1     name:'xiao B',     getName:function(){//2        //在这里申明一个变量,this总是指向调用者        var o = this;       return function(){//3           return o.name ;        }     }};alert(obj.getName()());

为什么申明了一个变量就会得到你理想的结果呢?

因为javascript 在执行的时候,回去看下一个执行域(//3)是否有使用当前执行域(//2)里的局部变量,如果没有 var o就将会被回收,如果有则将会保存这个变量。所以上例就会弹出‘xiao B’.

相信看到这里,你大概对闭包有所了解了,下面再看个例子

function f(x){// 2     var temp = x ; //局部变量//temp已经没有被使用        return function(x){// 3 (function 有了一个执行域 var obj)        temp += x ;//  又被使用了                                alert(temp);        }                         }                var a = f(50);//alert(a);a(5);                a(10);a(20);

手动去尝试一下吧!


原创粉丝点击