我正在看一本简单的书,上面写着:
function createRequest()
{
try
{
request = new XMLHttpRequest();
}
catch (tryMS)
{
try
{
request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (otherMS)
{
try
{
request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (failed)
{
request = null;
}
}
}
return request;
}
function getDetails(itemName)
{
var request = createRequest();
if (request==null)
{ alert("Unable to create request");
return;
}
var url= "getDetails.php?ImageID=" + escape(itemName);
request.open("GET",url,true);
request.onreadystatechange = displayDetails;
request.send(null);
}
function displayDetails()
{
if (request.readyState == 4)
{
if (request.status == 200)
{
detailDiv = document.getElementById("description");
detailDiv.innerHTML = request.responseText;
}
}
}
上面的所有代码都很好,对我来说也可以。.但几页后它说:
在请求变量之前删除变量关键字非常重要,因此回调可以引用变量...
但是上面的示例如何起作用?如果我们调用变量'request'
并在createRequest
方法中将其与全局变量映射是巧合吗?
看看下面的图片:
为什么会这样?在一个示例中,使用var
之前的request
变量并且一切都很好,而在另一个var
中避免使用,因此回调中的方法可以访问它。.但是回调中的方法如何访问第一个示例中的request
变量...
这令人困惑,因为有两个类似的示例,但有不同的解释。
编辑 附言:要求必须是全球性的? :o
谢谢大家 干杯
答案 0 :(得分:1)
在两个示例中,都创建了隐式全局变量,以便可以与回调共享它们。 创建第二个请求变量时,它将在getDetails函数内创建一个局部变量。因此,当createRequest()返回全局变量时,局部变量将成为对其的引用。
这是一个非常糟糕的建议,表明作者缺乏理解。但这似乎是一个古老的文本,因为现在已经不推荐使用activeX对象,所以以前可能不太喜欢全局变量。正确的方法是将responseText或responseXML作为参数发送给回调,或者将整个请求作为回调的参数发送。
也许作者不想使请求代码更复杂,但是恕我直言,这不是向人们传授知识的好方法。
function createRequest( method, url, callback, payload ) {
var request = new XMLHttpRequest();
if ( !request ) {
alert( "Unable to create request" );
return null;
}
request.open( method, url );
request.onreadystatechange = function() {
if (request.readyState === 4 && request.status === 200 ) {
callback( request.responseText );
}
};
request.send( payload );
};
function getDetails( itemName, callback ) {
createRequest( "GET", "getDetails.php?ImageID=" + escape(itemName), callback, null );
};
function displayDetails( detail ) {
var detailDiv = document.getElementById("description");
detailDiv.innerHTML = detail;
};
getDetails( "someItemName", displayDetails );
答案 1 :(得分:0)
您是正确的,在第一个示例中,函数createRequest
未使用var
,这意味着您要在执行{时创建一个全局变量 request
{1}}。
在大多数情况下,我们应该避免使用gobal var。
request = new XMLHttpRequest();