callback函数中的javascript类variables作用域

可能重复:
在Javascript中,为什么“this”运算符不一致?

我有以下class级:

function Chat(some, nick, url) { this.socket = null; this.Nickname = nick; this.Url = url; this.Connect = function () { socket = io.connect(this.Url); socket.on('connect', function (data) { var p = this.Nickname; //this.Nickname is undefined why? // how can I acess to the Nickname variable or function? } }; } 

如何从连接callback函数访问实例variables或函数?

       

网上收集的解决方案 "callback函数中的javascript类variables作用域"

最简单的解决scheme就是使用that技巧

 var that = this; //that is a normal variable //so it is lexically scoped //and can be used in inner functions socket.on('connect', function(data){ var p = that.NickName; }); 

另一种可能是明确地将正确的这个绑定到callback函数

 socket.on('connect', function(data){ var p = this.Nickname; }.bind(this)); 

这个技巧的优点是嵌套到尽可能多的callback,而绑定版本的优点是可以让你仍然在里面使用“this”。

绑定方法的一个缺点是它不支持IE <= 8,所以如果你需要支持古代浏览器,你可能需要使用一个填充。

编辑:这个答案有点旧。 现在,你可能不需要担心IE6了,你可能会使用胖箭头语法 ,而不会覆盖this

问题是JavaScript中的this值可以根据callback调用的方式而改变。 解决这个问题的最简单的方法是将原来的this对象保存到一个本地的名为self 。 本地被捕获在callback中,并可用于访问成员值。 例如。

 function Chat(some, nick, url) { var self = this; this.socket = null; this.Nickname = nick; this.Url = url; this.Connect = function () { socket = io.connect(this.Url); socket.on('connect', function (data) { var p = self.Nickname; //this.Nickname is undifined why? // how can I acess to the Nickname variable or function? } }; } 

你可以改变这个: var p = this.Nickname; 到这个var p = nick;

你的问题是, this是指你在callback中使用的函数的本地范围。 这不是外部函数的范围。

JavaScript有闭包 ,至less是漂亮的。

看看这个问题:

JavaScriptclosures如何工作?

它应该可以帮助你理解为什么每个人都告诉你把一个var something = this放在函数的上面,然后用something里面的东西来维护原来的this

这是一个小提琴,显示使用本地副本:

http://jsfiddle.net/k7vC6/1/

在这种情况下, thisself是一回事,但是使用self是安全的。

“this”代表你在那个范围内的function。

尝试:

 function Chat(some, nick, url) { this.socket = null; this.Nickname = nick; this.Url = url; var that = this; this.Connect = function () { socket = io.connect(this.Url); socket.on('connect', function (data) { var p = that.Nickname; //this.Nickname is undifined why? // how can I acess to the Nickname variable or function? } }; } 

请注意,将“this”分配到“that”