正在学习javascript闭包机制,有以下两段代码:<script type="text/javascript">
var n = 2011;
  var f1={
    n:999,
        
    f2:function (){
            var that = this;
      return function(){
                 return that.n;
            };
    }
  };  alert(f1.f2()());                 //999</script>                            
<script type="text/javascript">
var n = 2011;
  function f1(){
    var n=999;
        var that = this;
    function f2(){
      return that.n;
    }
        
return f2;
  }    var result = f1();
  alert(result());                  //2011</script>
请问第二段代码为什么引用的是全局的n而第一段代码引用的是f1的成员变量n?这个问题是否和object对象与function对象特点有关,请指教!谢谢!

解决方案 »

  1.   

    哪来的闭包,不就是对this的指代的对象不同而已一个是object一个是window
      

  2.   

    这是一个典型的闭包,你可以看看效果。
    <html>
    <title>Ext源码分析</title>
    <meta http-equiv="Content-Type" content="text/html" ; charset="utf-8">
    <body onload="myEffect()">
    <table id="mytab" border="1">
    <tr>
    <td>第1列</td>
    <td>第2列</td>
    <td>第3列</td>
    <td>第4列</td>
    <td>第5列</td>
    </tr>
    <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    </tr>
    <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    </tr>
    <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    </tr>
    <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    </tr>
    </table>
    <div id="console" style="background:#ffff00"></div>
    </body>
    <script type="text/javascript" src="closure_example.js"></script>
    </html>
    function myEffect(){
    var console=document.getElementById('console');
    var tab=document.getElementById('mytab');
    var trs=tab.getElementsByTagName('tr');
    for(var i=0;i<trs.length;i++){
    var tr=trs[i];
    tr.onmouseover=function(){
    this.style.background="#ff0000";
    }
    tr.onmouseout=function(){
    this.style.background="#ffffff";
    }
    tr.onclick= function(){
    var rowNum=i;
    var ss=function(){x="你点击了第"+rowNum+"行"; return x}
    alert(i);
    console.innerHTML=ss;
    }
    //闭包的应用
    //tr.onclick=(function(){
    //var rowNum=i;
    //return function(){
    //console.innerHTML="你点击了第"+rowNum+"行";
    //}
    //})();
    }
    }
      

  3.   

    在对象里this指向当前对象
    在function里this指向window
      

  4.   

    那这样是不是闭包?function f1(){
        var n=999;
        function f2(){
          alert(n); 
        }
        return f2;
      }
      var result=f1();
      result(); // 999
      

  5.   

    不是闭包,你看明显不符合闭包3要素么,我给你改改。
    <script type="text/javascript">
    var n = 2011;
    function f1(){
        var n=999;
        var f2=(function (){
    i=n;
           return function(){alert(i)}; 
        })();
        return f2;
      }
      var result=f1();
      result(); </script> 
    先去看看函数的原型,作用域链知识吧,这样方便你理解闭包~~