是什么导致这些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,它实际上是有效的吗?谢谢,尽管假设浏览器似乎无法修复隐含的全局错误-仅为验证器添加自定义注释对我来说似乎很奇怪,理论上,我的做事方式没有什么不好的地方吗?阿卡,它真的有效吗?