簡體   English   中英

是什么原因導致這些javascript驗證錯誤(隱含全局和已定義的var)?

[英]What's causing these javascript validation errors (Implied global and already defined var)?

誰能解釋我為什么:

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驗證程序

關於第一個錯誤 ,這是JSLint文檔摘錄

未定義的變量和函數

JavaScript的最大問題是它對全局變量的依賴,尤其是隱含的全局變量。 如果未明確聲明變量(通常使用var語句),則JavaScript會假定該變量是全局變量。 這可以掩蓋拼寫錯誤的名稱和其他問題。

JSLint希望在使用或調用所有變量和函數之前先聲明它們。 這樣就可以檢測隱含的全局變量。 這也是一個好習慣,因為它使程序更易於閱讀。

有時,文件依賴於在其他位置定義的全局變量和函數。 您可以通過在文件中添加注釋來識別JSLint,這些注釋列出了程序所依賴的全局函數和對象,但這些函數和對象未在程序或腳本文件中定義。

全局聲明可以如下所示:

/*global getElementByAttribute, breakCycles, hanoi */

全局聲明以/*global開頭。 請注意,g之前沒有空格。 您可以根據需要添加/*global注釋。 它們必須在使用它們指定的變量之前出現。

關於您的問題,以下部分最有可能幫助您修復錯誤:

可以為您預定義一些全局變量。 選擇“假定瀏覽器(瀏覽器)”選項(請參閱下面的選項)以預定義Web瀏覽器提供的標准全局屬性,例如窗口和文檔以及警報。 選擇Assume Rhino(rhino)選項以預定義Rhino環境提供的全局屬性。 選擇“假設Yahoo Widget(小部件)”選項以預定義Yahoo!提供的全局屬性。 小部件環境。

之所以出現第二個錯誤,是因為您對每個異常(包括嵌套異常)重復使用了變量“ e ”。 重命名每個異常的變量以避免這種情況。

使用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
        }
    }
}

您正在每個try / catch塊中重用變量e。 嘗試重命名它們以避免沖突。 其他問題只是警告您正在使用需要在其他地方定義的內容。

JSlint通常會給出很多錯誤...

對我來說,已經定義了'e'似乎很清楚:)您對所有try-catch語句使用相同的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM