解决方案 »

  1.   


    function createRequest() {
      try {
    //这里没有用var 声明。request就成了全局变量
        request = new XMLHttpRequest();
      } catch (tryMS) {
        try {
          request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (otherMS) {
          try {
            request = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (failed) {
            request = null;
          }
        }
      }
      return request;
    }
    /////////////////////////
    function showTab() {
    var request = creatRequest();
    /*  略 */
    request.onreadystatechange = showAjax;
    /*  略 */
    }
    //showTab()和showAjax()是两个独立的函数。不是闭包函数
    function showAjax() {
    //这里的request不是showTab()函数中定义的局部变量,而是createRequest()函数中定义的全局变量
    if (request.readyState == 4) {
        if (request.status == 200) {
          document.getElementById("content").innerHTML = request.responseText;
        }
      }
    }
      

  2.   

    这样才是闭包function showTab() {
    var request = creatRequest();
    /*  略 */
    function showAjax() {
    if (request.readyState == 4) {
    if (request.status == 200) {
      document.getElementById("content").innerHTML = request.responseText;
    }
      }
    }
    request.onreadystatechange = showAjax;
    /*  略 */
    }
      

  3.   

    谢谢这位仁兄function showTab() { 
    var request = creatRequest(); 
    /*  略 */
    request.onreadystatechange = function() {
     if (request.readyState == 4) {
    /*略*/
    }
    }; 
    /*  略 */
    }如果这样改写,这个就不是独立函数,就用showTab的request了。。.?
      

  4.   

    你认为的那个写法是错误和隐含危险的function showTab() {
    var request = creatRequest();
    /*  略 */
    request.onreadystatechange = showAjax;
    /*  略 */       function showAjax() {
    if (request.readyState == 4) {
        if (request.status == 200) {
          document.getElementById("content").innerHTML = request.responseText;
        }
      }
    }
    }这样才是一个明显的封闭区域 才是一个稳固的闭包