Что вызывает эти ошибки проверки JavaScript (подразумевается глобальная и уже определенная переменная)? - PullRequest
1 голос
/ 04 января 2009

Может ли кто-нибудь объяснить мне, почему:

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

Ответы [ 4 ]

6 голосов
/ 04 января 2009

Относительно первой ошибки , вот выдержка из документации JSLint :

Неопределенные переменные и функции

Самая большая проблема JavaScript - это зависимость от глобальных переменных, особенно подразумеваемые глобальные переменные. Если переменная не является явно объявлен (обычно с заявление), то JavaScript предполагает что переменная была глобальной. Это может маскировать имена с ошибками и другие проблемы.

JSLint ожидает, что все переменные и функции объявлены до того, как они используется или вызывается. Это позволяет обнаружение подразумеваемых глобальных переменных. это также хорошая практика, потому что это делает программы легче читать.

Иногда файл зависит от глобальные переменные и функции, которые определены в другом месте. Вы можете идентифицировать их в JSLint, включая комментарий в вашем файле, который перечисляет глобальные функции и объекты, которые ваш Программа зависит от, но это не определено в вашей программе или скрипте файл.

Глобальная декларация может выглядеть так это:

/*global getElementByAttribute, breakCycles, hanoi */

Глобальное объявление начинается с /*global. Обратите внимание, что нет пространство перед г. Вы можете иметь как много /*global комментариев, как вам нравится. Они должны появиться перед использованием переменные, которые они указывают.

Что касается вашей проблемы, следующий раздел, скорее всего, поможет вам исправить ошибки:

Некоторые глобальные переменные могут быть предопределены для вы. Выберите Предположить браузер (браузер) опция (см. ниже) предопределить стандартную глобальную свойства, которые предоставляются через Интернет браузеры, такие как окно и документ и оповещение. Выберите Предположим, Rhino (носорог) вариант предопределить глобальный свойства, предоставляемые Rhino среда. Выберите Предположим, Yahoo Опция виджета (виджета) для предопределения глобальные свойства, предоставляемые Yahoo! Среда виджетов.

вторая ошибка дается, потому что вы повторно используете переменную "e" для каждого исключения, включая вложенные. Переименуйте переменные в каждом исключении, чтобы избежать этого.

4 голосов
/ 04 января 2009

Было бы более разумно использовать фреймворк, такой как jQuery (особенно если вы серьезно хотите поддерживать более старые версии IE (до v6)), но я предполагаю, что есть причина, по которой вы этого не делаете.

Было бы лучше, если бы а) вы не вложили try-catches и б) вы разработали набор функций, а именно одну, чтобы получить объект 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
        }
    }
}
3 голосов
/ 04 января 2009

Вы повторно используете переменную e в каждом блоке try / catch. Попробуйте переименовать их, чтобы избежать столкновения. Другие проблемы - это просто предупреждения о том, что вы используете вещи, которые должны быть определены в другом месте.

1 голос
/ 04 января 2009

JSlint обычно выдает МНОГО ошибок ...

'e' уже определено, мне кажется довольно ясным :) вы используете одну и ту же переменную для всех ваших операторов try-catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...