如果你有一个对象并为其设置属性,你可以在调用该对象的函数中访问该属性。但是,如果你调用一个函数并执行 ajax 请求,从 onreadystatechange 调用不同的函数,那么次要响应函数将无法访问该属性。这有点令人困惑,请参见下面的示例。该属性 this.name 是发生变化的属性。
//from W3Schools website
function getXHR(){if (window.XMLHttpRequest){return new XMLHttpRequest();}if (window.ActiveXObject){return new ActiveXObject("Microsoft.XMLHTTP");}return null;}
function TestObject()
{
this.name = ""; //public
var xhr = null; //private
var response = function() //private
{
if(xhr.readyState > 3)
{
alert("B: my name is " + this.name);
}
}
this.send = function() //public
{
alert("A: my name is " + this.name);
if(xhr === null)
{
xhr = getXHR();
}
var url = "http://google.com";
xhr.onreadystatechange = response;
xhr.open("GET", url, true);
xhr.send(null);
}
}
var o = new TestObject();
o.name = "Ice Cube";
o.send();
结果如下:
A: my name is IceCube
B: my name is undefined
如果响应是公共的,那么也会发生这种情况。如果xhr也是公共的,那么也会发生此问题。有些事情发生了,导致调用响应函数时无法访问相同的参数。
self
是一个特殊的全局属性,也指向窗口,尽管在函数上下文中变量会覆盖它,但这样会更加混乱,是的... - meder omuralievthat
而不是self
,尽管我更喜欢self
。 - Hooray Im Helping