当我在IE中运行以下代码时,运行正常。
但是在mozilla ff中,layerId的值为空,因为{1}在第1行为空。
reqGetSubMenuRef22.responseText
答案 0 :(得分:0)
processStateChangeGetSubMenuRef22
(不是最好的功能名称BTW)是一个回调。它在reqGetSubMenuRef22
的上下文中调用,而不是使用if (reqGetSubMenuRef22.readyState === 4)
,尝试使用if (this.readyState === 4 && this.status === 200)
。
该函数被引用为readystatechange
的处理程序事件,变量reqGetSubMenuRef22
,因此该函数将是reqGetSubMenuRef22
的方法,逻辑上(在这种情况下)它被this
引用。
只是为了澄清一下这个类比:你不要把你的起居室称为 Some Blvd Nr的起居室。 123,无论哪个城镇,无论哪个国家,你呢?当人们过来你说这是我的起居室,这是我们的家,这就是我住的地方 ......
同样reqGetSubMenuRef22
似乎是代码中的全局变量,您需要解决这个问题。在MDN上阅读有关JS this
的更多信息,如果是ajax调用,它对于进入closures
也很有用。
function readyStateCallback()
{
if (this.readyState === 4 && this.status === 200)
{
console.log(this.responseText);
//JSON string?:
var resp = JSON.parse(this.responseText);
//just txt:
var resp = this.responseText;
//HTML?
document.getElementById('showResponseHere').innerHTML = this.responseText;
//many more things you can do here...
}
}
为什么reqGetSubMenuRef22
不再起作用:
function sendRequest(str)
{
var reqGetSubMenuRef22;//<-- local scope, only accessible in function
var i;//local, too but different
//try catch stuff: reqGetSubMenuRef22 is now an ajax object
for (i=0;i<str.length;i++)
{
console.log(i);//just an example, you'll see why
}
reqGetSubMenuRef22.onreadystatechange = readyStateCallback;//reqGetSubMenuRef22 is still local
//setup reqGetSubMenuRef22, then:
reqGetSubMenuRef22.send();
}//end function
当sendRequest函数返回时,所有局部变量都是GC,变量i
从内存中删除。 reqGetSubMenuRef22
也应该是,但它附加了一个事件,并且此事件将触发一个在全局范围或另一个仍然存在的范围内声明的函数。
由于JS正在reqGetSubMenuRef22
对象上侦听onreadystatechange事件,因此该对象保持活动状态。因此,即使它的名称不再与任何东西相连,该对象仍然非常“在那里”。不是全局对象(aka窗口)调用readyStateCallback
函数,而是ajax对象(reqGetSubMenuRef22
)。因此,您可以使用this
从该函数内部访问ajax对象,它始终指向调用该函数的对象。 (调用与readyStateCallback();
相同的函数,这将指向全局对象(window
))回调完成后,它的作业this
或ajax对象将是垃圾收集,除非有其他事件发生,或者它仍然被引用到程序中的其他位置。
我很难解释这些东西,而且我很清楚我在这里简化过程,在整个地方采取捷径。但请在JavaScript中阅读this
。
BTW:在函数返回后仍然保持活动的对象实际上是一种类型的闭包:变量超出范围,但仍然可以被引用。这就是它归结为,这允许一些非常强大的结构,所以我也敦促你研究这个!