我在使用javascript中对象中的webmethods使用服务器回调时出现问题...
function myObject() {
this.hello = "hello";
var id = 1;
var name;
this.findName = function() {
alert(this.hello); //Displays "hello"
myServices.getName( id, this.sayHello );
}
this.sayHello = function(name) {
alert(this.hello); //Displays null <-- This is where I'm confused...
alert(name); //Displays the name retrieved from the server
}
this.findName();
}
因此,当创建一个新的myObject时,它会找到该名称,然后在找到该名称后调用sayHello。
服务例程工作并返回正确的名称。
问题是,从服务器返回名称并调用this.sayHello后,它似乎不在同一个对象中(没有引用我们在查找名称时遇到的同一个myObject) )因为this.hello给出了一个空...
有什么想法吗?
答案 0 :(得分:2)
这不是网络服务问题。这是标准的JavaScript功能。在回调函数中,对“this”的引用成为对全局范围“窗口”对象的引用。以下是解决这个问题的方法:
function myObject() {
this.hello = "hello";
var id = 1;
var name;
var self = this; //reference to myObject
this.findName = function() {
alert(this.hello); /* Displays "hello" */
myServices.getName( id, this.sayHello );
}
this.sayHello = function(name) {
alert(self.hello); /* Displays "hello" instead of "undefined" */
alert(name); /* Displays the name retrieved from the server */
}
this.findName();
}
答案 1 :(得分:1)
你必须以某种方式在调用时绑定'this'对象的范围,以便稍后在同一范围内执行回调。目前,您的回调函数在全局窗口范围内以编码方式执行,因此'this'== Window。如果您使用的是框架,它们通常会提供一些方法来将范围作为回调的一部分来简化。
您还可以围绕回调参数创建一个闭包,如下所述:JavaScript Callback Scope