我正在使用文本编辑器在FireFox 11上编写javascript。在下面的例子中,“var n = this.val”变为“未定义”。如何在原始类对象中获取本地值?
<html>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var Test = {
val : 0,
begin: function(v){
this.val = v;
this.recieve();
},
complete: function(o){
var n = this.val; // undefined
},
recieve : function(){
$.ajax({
url : "http://www.yahoo.com/", // Dummy
type: "POST",
dataType: "json",
complete: this.complete,
timeout: 1000,
});
},
};
var c = Object(Test);
c.begin(10);
</script>
</body>
</html>
答案 0 :(得分:1)
complete: this.complete.
的 bind(this)
强>
这在旧的IE版本中不起作用,但通过一些努力(添加es5 shim
代码),即使在那里也可以使它工作。
complete
函数在ajax请求的上下文中执行。如果你写这样的代码:
var method = Test.complete;
method();
this
未保留,您只需获取该函数的链接即可。
name1.name2()
在js中有一个技巧。 name2
不仅应该是name1
的属性而且是一个函数,但它(name2)也在name1
的上下文中执行。
var x = 'outer', b = {
x: 'inner',
a: function() { return this.x; }
};
[(b.a)(), (m = b.a)()] // ["inner", "outer"]
答案 1 :(得分:0)
由于complete
是回调,因此范围已更改,this
未引用名为Test
的对象。您只需将this
替换为Test
函数中的complete
:
var n = Test.val;
=== UPDATE ===
您的问题是“如何获取原始类对象中的本地值?”。我的回答向您展示了如何获取静态对象的字段。
如果您需要共享对象,则应将结构更改为:
function Test() {
var self = this;
this.begin = function(v) {
this.val = v;
this.recieve();
}
this.complete = function(o) {
var n = this.val;
}
this.recieve = function() {
$.ajax({
url : "http://www.yahoo.com/", // Dummy
type: "POST",
dataType: "json",
complete: function(data) {
self.complete(data);
},
timeout: 1000,
});
}
}
现在您可以创建两个不同的对象:
var c2 = new Test2;
c2.begin(10);
var d2 = new Test2;
d2.begin(20);
答案 2 :(得分:0)
内部完整处理程序this
不是Test
。常见的解决方案是为它创建一个代理变量。
recieve : function(){
var proxy = this;
$.ajax({
url : "http://www.yahoo.com/", // Dummy
type: "POST",
dataType: "json",
complete: function(){
proxy.complete();
},
timeout: 1000,
});
},
或(在这种情况下)只是Test.val
在函数complete
complete: function(o){
var n = Test.val;
},