Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致这些javascript验证错误(隐含的全局和已定义的变量)?_Javascript_Ajax_Validation - Fatal编程技术网

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

是什么导致这些javascript验证错误(隐含的全局和已定义的变量)?,javascript,ajax,validation,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("Msxm

谁能解释一下原因:

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验证程序,您在每个try/catch块中重用变量e。尝试重命名它们以避免冲突。其他问题只是警告您正在使用需要在其他地方定义的东西。

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

JSlint通常会给出很多错误


“e”的定义对我来说似乎很清楚:您对所有try-catch语句都使用相同的变量。

JSlint通常会给出很多错误

“e”的定义对我来说似乎很清楚:所有try-catch语句都使用相同的变量。

关于第一个错误,下面是一个:

未定义的变量和函数

JavaScript最大的问题是它的 依赖于全局变量, 特别是隐含的全局变量。 如果变量不是显式的 通常使用var声明 语句,然后JavaScript假定 这个变量是全局的。这个可以 掩盖拼写错误的姓名和其他信息 问题

JSLint希望所有变量和 函数在调用之前声明 使用或调用。这使得它能够 检测隐含的全局变量。它是 这也是一个很好的实践,因为它使 程序更容易阅读

有时文件依赖于 全局变量和函数 其他地方也有定义。你可以 通过包括以下内容,向JSLint识别这些 文件中的注释,其中列出 全局函数和对象 程序取决于,但事实并非如此 在程序或脚本中定义 文件

一个全局声明可以看起来像 这:

全球宣言始于 /*全球。请注意,没有 在g。你可以有 如您所愿,提供许多/*全球评论。 它们必须在使用前出现 它们指定的变量

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

一些全局变量可以为 你选择浏览器中的选项 浏览器选项请参见下面的选项 要预定义标准全局 由web提供的属性 浏览器,如窗口和文档 和警觉。选择“假设Rhino” rhino选项可预定义全局 犀牛提供的财产 环境选择“假定为Yahoo” 用于预定义的小部件选项 由提供的全局属性 雅虎!小部件环境

给出第二个错误是因为对每个异常(包括嵌套异常)重复使用变量e。重命名每个异常上的变量以避免此情况。

关于第一个错误,下面是一个:

未定义的变量和函数

JavaScript最大的问题是它的 依赖于全局变量, 特别是隐含的全局变量。 如果变量不是显式的 通常使用var声明 语句,然后JavaScript假定 这个变量是全局的。这个可以 掩盖拼写错误的姓名和其他信息 问题

JSLint希望所有变量和 函数在调用之前声明 使用或调用。这使得它能够 检测隐含的全局变量。它是 这也是一个很好的实践,因为它使 程序更容易阅读

有时文件依赖于 全局变量和函数 其他地方也有定义。你可以 通过包括以下内容,向JSLint识别这些 文件中的注释,其中列出 全局函数和对象 程序取决于,但事实并非如此 在程序或脚本中定义 文件

一个全局声明可以看起来像 这:

全球宣言始于 /*全球。请注意,没有 在g。你可以有 如您所愿,提供许多/*全球评论。 它们必须在使用前出现 它们指定的变量

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

一些全局变量可以为 你选择浏览器中的选项 浏览器选项请参见下面的选项 要预定义标准全局 由web提供的属性 浏览器,如窗口和文档 和警觉。选择“假设Rhino” rhino选项可预定义全局 犀牛提供的财产 环境选择“假定为Yahoo” 用于预定义的小部件选项 由提供的全局属性 雅虎!小部件环境


给出第二个错误是因为对每个异常(包括嵌套异常)重复使用变量e。重命名每个异常上的变量以避免这种情况。

使用类似jQuery的框架会更明智,尤其是如果您认真考虑的话 希望支持旧版本的IE v6之前的版本,但我认为您不这么做是有原因的

如果a您不嵌套try catch,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
        }
    }
}

使用jQuery这样的框架会更明智,特别是如果您真的想支持旧版本的IE v6之前的版本,但我认为您不这么做是有原因的

如果a您不嵌套try catch,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
        }
    }
}

谢谢,那么将Es重命名为e1、e2和e3会更干净吗?我觉得它不是很干净-我相信上面的例子是从W3C复制的。不,重命名“e”不会更干净。JSLint显示错误和警告。这些只是警告,即使用“e”会使该块中以前的错误对象不可用。如果您需要第二个catch中的第一个'e',则需要重命名。我会忽略这个警告。我也会避免嵌套try-catch。谢谢,那么将Es重命名为例如e1、e2和e3会更干净吗?我觉得它不是很干净-我相信上面的例子是从W3C复制的。不,重命名“e”不会更干净。JSLint显示错误和警告。这些只是警告,即使用“e”会使该块中以前的错误对象不可用。如果您需要第二个catch中的第一个'e',则需要重命名。我会忽略这个警告。我也会避免嵌套try-catch。谢谢,尽管假设浏览器似乎无法修复隐含的全局错误-仅为验证器添加自定义注释对我来说似乎很奇怪,理论上,我的做法没有什么不好的地方吧?aka,它实际上是有效的吗?谢谢,尽管假设浏览器似乎无法修复隐含的全局错误-仅为验证器添加自定义注释对我来说似乎很奇怪,理论上,我的做事方式没有什么不好的地方吗?阿卡,它真的有效吗?