是什么导致了这些javascript验证错误(隐含的全局和已定义的var)?

时间:2009-01-04 15:28:21

标签: javascript ajax validation

任何人都可以解释原因:

function doAjax() {
    var xmlHttpReq = false;
    try { // Firefox, Opera 8.0+ and Safari
        xmlHttpReq = new XMLHttpRequest();
    }
    catch (e) { // Internet Explorer
        try {
            xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX. Please use an AJAX compatible browser.");
                return false;
            }
        }
    }
    xmlHttpReq.open('GET', 'handler.php', true);
    xmlHttpReq.onreadystatechange = function() {
        if (xmlHttpReq.readyState == 4) {
            var response = xmlHttpReq.responseText;
            handleAjaxResponse(response);
        }
    };
    xmlHttpReq.send(null);
    return true;
}

导致以下验证错误:

Error:

Implied global: ActiveXObject 8, XMLHttpRequest 4, alert 15, handleAjaxResponse 24

Problem at line 10 character 16: 'e' is already defined.

catch (e) {

Problem at line 14 character 20: 'e' is already defined.

catch (e) {

由JSlint.com javascript验证器

4 个答案:

答案 0 :(得分:6)

关于第一个错误,这是一个exerpt from the JSLint Documentation

  

未定义的变量和函数

     

JavaScript最大的问题是它   对全局变量的依赖,   特别是隐含的全局变量。   如果变量未明确   声明(通常使用var   声明),然后JavaScript假设   变量是全局的。这个可以   掩盖拼写错误的名字和其他   问题。

     

JSLint期望所有变量和   函数在它们之前被声明   使用或调用。这允许它   检测隐含的全局变量。它是   也是好的做法,因为它使   程序更容易阅读。

     

有时文件依赖于   全局变量和函数   在别处定义。您可以   通过包含来识别这些到JSLint   您的文件中的注释列出了   你的全局函数和对象   程序取决于,但事实并非如此   在您的程序或脚本中定义   文件。

     

全局声明可能看起来像   这样:

/*global getElementByAttribute, breakCycles, hanoi */
  

全球声明始于   /*global。请注意,没有   在g之前的空间。你可以拥有   很多/*global条评论。   它们必须在使用之前出现   他们指定的变量。

关于您的问题,以下部分最有可能帮助您解决错误:

  

可以为其预定义一些全局变量   您。选择“假定浏览器”   (浏览器)选项(参见下面的选项)   预定义标准全局   由web提供的属性   浏览器,例如窗口和文档   和警报。选择假设Rhino   (rhino)选项预定义全局   犀牛提供的物业   环境。选择假设雅虎   Widget(小部件)选项预定义   由...提供的全球属性   雅虎小部件环境。

出现第二个错误,因为您为每个异常重复使用变量“e”,包括嵌套的异常。重命名每个异常的变量以避免这种情况。

答案 1 :(得分:4)

使用像jQuery这样的框架更为明智(特别是如果你真的想要支持旧版本的IE(v6之前的版本)),但我会假设你没有这样做。

如果a)你没有嵌套try-catches并且b)你考虑了一组函数,即一个函数来获取一个Xhr对象,另一个函数使用一个Xhr对象来制作一个通用的ajax请求,那么会更好。外部“doAjax”函数执行您想要进行的特定ajax调用: -

function getXHR()
{
    var result = null
    if (window.XMLHttpRequest)
    {
        result = new XMLHttpRequest();
    }
    else
    {
        try { result = new ActiveXObject("MSXML2.XMLHTTP.3.0") }
        catch (e) { }

        if (result == null)
        {
            try { result = new ActiveXObject("Microsoft.XMLHTTP") }
            catch (e) { }
        }
    }
    return result; 
}


function ajaxRequest(url, data, callBack)
{
    var xmlHttpReq = getXHR();
    if (xmlHttpReq)
    {
        xmlHttpReq.open(data != null ? 'GET' : 'POST', url, true);
        xmlHttpReq.onreadystatechange = function()
        {
            if (xmlHttpReq.readyState == 4)
            {
                //what happens if status is not 200
                callBack(xmlHttpReq.responseText);
            }
        };
        xmlHttpReq.send(null);
        return true;
    }
    else
    {
        return false;
    }
}

function doAjax()
{
     var result = ajaxRequest('handler.php', null, handleAjaxResponse);
     if (!result) alert("Your browser does not support AJAX. Please use an AJAX compatible browser.");
     return result;
}

进一步的改进是使回调接受XHR对象而不是基本的responseText。这会给你更多的灵活性。如果回调函数只需要文本,则可以使用此函数: -

function getTextFromXhr(xhr)
{
    xhr.onreadystatechange = fnVoid;
    if (xhr.status == 200)
    {
        return xhr.responseText;
    }
    else
    {
        throw {number: xhr.status,
            description: xhr.statusText,
            responseText: xhr.responseText
        }
    }
}

答案 2 :(得分:3)

您正在每个try / catch块中重用变量e。尝试重命名它们以避免碰撞。其他问题只是警告你正在使用需要在别处定义的东西。

答案 3 :(得分:1)

JSlint通常会给出很多错误......

'e'已定义似乎对我很清楚:)你对所有的try-catch语句使用相同的变量。