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或函数?
最简单的解决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
。
“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”