关于js闭包的一个例子

  首先,看下面这段代码:

 1 var name = "The Window";
 2 var object = {
 3     name : "My Object";
 4     getNameFunc : function(){
 5         return function(){ 
 6             return this.name; 
 7         };
 8     }
 9 };
10 alert(object.getNameFunc()());

    最后的结果是"The Window"而不是"The Object",为何呢?
    在分析这段代码前,首先简单说一下闭包:当内部函数在定义了它的作用域外部被引用时,就创建了该函数的闭包;如果内部函数引用了外部函数的变量,那么外部函数在调用完毕后,也不会被GC回收,因为闭包依赖它。
    如果直接给出alert(this.name);那么结果是显而易见的:"The Window"
object.getNameFunc()方法中,将function(){return function(){return this.name;}}做为返回值,则object.getNameFunc()返回的是return function(){return this.name;},其类型应该是function(),没有被执行,当然经常玩firebug的再熟悉不过了。我们再仔细看object.getNameFunc()()是有两个括号的,那么这个function()类型的返回值是什么呢,就是this.name,所以说object.getNameFunc()()就完全等价于this.namealert(object.getNameFunc()())其实就是alert(this.name),结果再明显不过了。
    这个例子是对闭包的典型应用,要想明白这个例子,必须理解闭包的本质:当内部函数在定义了它的作用域外部被引用时,就创建了该函数的闭包。闭包说白了就是封闭环境中的一段代码,我们只是把它拿到函数外部执行而已。其实function(){ return this.name; }是在函数的外部被引用的,因为object.getNameFunc()的返回值就是function(){ return this.name; },而引用它的对象恰恰又是window本身,this指向window,javascript定义的全局变量都可以看做window的一个属性,this.name也就是window.name了。

posted @ 2013-04-14 14:58  FingerDancing  阅读(176)  评论(0编辑  收藏  举报