关于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.name,alert(object.getNameFunc()())其实就是alert(this.name),结果再明显不过了。
这个例子是对闭包的典型应用,要想明白这个例子,必须理解闭包的本质:当内部函数在定义了它的作用域外部被引用时,就创建了该函数的闭包。闭包说白了就是封闭环境中的一段代码,我们只是把它拿到函数外部执行而已。其实function(){ return this.name; }是在函数的外部被引用的,因为object.getNameFunc()的返回值就是function(){ return this.name; },而引用它的对象恰恰又是window本身,this指向window,javascript定义的全局变量都可以看做window的一个属性,this.name也就是window.name了。