这是我的代码:
request_xml: function()
{
http_request = false;
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{
http_request.overrideMimeType('text/xml');
}
if (!http_request)
{
return false;
}
http_request.onreadystatechange = this.response_xml;
http_request.open('GET', realXmlUrl, true);
http_request.send(null);
xmlDoc = http_request.responseXML;
},
response_xml:function ()
{
if (http_request.readyState == 4)
{
if(http_request.status == 404 && countXmlUrl<=3)
{
countXmlUrl++;
realXmlUrl = xmlUrl[countXmlUrl];
this.request_xml();
}
if (http_request.status == 200)
{
xmlDoc = http_request.responseXML;
alert("need to update3");
this.peter_save_data();
}
}
},
peter_save_data:function()
{
// removed function code
},
奇怪的是,警报没有问题,但是下面的函数调用给了我这个错误:
Error: this.peter_save_data is not a function
从其他地方调用同样该死的函数可以正常工作。
答案 0 :(得分:29)
您可以在调用XML生成之前执行此操作。
var that = this;
以后......
that.peter_save_data();
由于this
在使用新函数更改范围时经常更改,因此无法使用它来访问原始值。将其别名化为允许您仍然可以访问此原始值。
答案 1 :(得分:6)
缺少的一个重要部分是如何调用 response_xml
。这很重要,因为它会改变this
的内容(参见Jared的评论)。
请记住,this
可以被认为是(粗略地)“方法调用的接收者”。如果response_xml
直接传递给用作回调,那么它当然不起作用 - this
可能是window
。
考虑这些:
var x = {f: function () { return this }}
var g = x.f
x.f() === x // true
g() === x // false
g() === window // true
快乐的编码。
“修复”可能只是为了改变response_xml
的调用方式。有很多方法可以做到这一点(通常有一个闭包)。
示例:
// Use a closure to keep he object upon which to explicitly invoke the method
// inside response_xml "this" will be "that",
// which was "this" of the current scope
http_request.onreadystatechange = (function (that) {
return function () { return that.response_xml() }
}(this)
// Or, alternatively,
// capture the current "this" as a closed-over variable...
// (assumes this is in a function: var in global context does not create a lexical)
var self = this
http_request.onreadystatechange = function () {
// ...and invoke the method upon it
return self.response_xml()
}
就个人而言,我只会使用jQuery或类似的东西; - )
答案 2 :(得分:-1)
如果你想要类似于类的行为,请使用正确的语法,使用它的库,使用JSON将参数传递给一个使其中的类的函数。
function MyClass(CTOR paarams){
var response_xml=function ()
{
if (http_request.readyState == 4)
{
if(http_request.status == 404 && countXmlUrl<=3)
{
countXmlUrl++;
realXmlUrl = xmlUrl[countXmlUrl];
this.request_xml();
}
if (http_request.status == 200)
{
xmlDoc = http_request.responseXML;
alert("need to update3");
this.peter_save_data();
}
}
}
var peter_save_data=function()
{
// removed function code
}
}
var Test = new MyClass(somthing,another_something);
Test.response_xml();
//etc etc.
或者,使用像Mootools这样的库,您可以在其中使用JSON:
var T = new Class({
response_xml:function ()
{
if (http_request.readyState == 4)
{
if(http_request.status == 404 && countXmlUrl<=3)
{
countXmlUrl++;
realXmlUrl = xmlUrl[countXmlUrl];
this.request_xml();
}
if (http_request.status == 200)
{
xmlDoc = http_request.responseXML;
alert("need to update3");
this.peter_save_data();
}
}
},
peter_save_data:function()
{
// removed function code
}
});
var X = new T();//etc etc