область переменных javascript в функции обратного вызова

Возможный дубликат:
В Javascript, почему «этот» оператор несовместим?

У меня есть следующий 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? } }; } 

Как я могу получить доступ к переменной экземпляра или функции из функции обратного вызова connect?

Самое простое решение – использовать 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; }); 

Другая возможность явно привязывает это значение к функции обратного вызова

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

Преимущество that трюка заключается в том, что вы можете вложить столько обратных вызовов, сколько хотите, а версия привязки имеет то преимущество, что вы можете использовать «это» внутри.

Недостатком метода связывания является то, что он не поддерживается в IE <= 8, поэтому вам может понадобиться использовать прокладку, если вам нужно поддерживать старые браузеры.

edit : Этот ответ немного стар. В настоящее время вам, вероятно, больше не нужно беспокоиться о IE6, и вы можете использовать синтаксис сильной стрелки , который не перезаписывает this .

Проблема в том, что this значение в javascript может меняться в зависимости от того, как вызывается обратный вызов. Самый простой способ обойти это – сохранить исходный объект в локальном имени self . Локальный захвачен в обратном вызове и может использоваться для доступа к значениям членов. Например.

 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 относится к локальной области функции, которую вы используете в обратном вызове. Это не объем внешней функции.

У JavaScript есть замыкания, которые, по меньшей мере, отличные.

Посмотрите на этот вопрос:

Как работают блокировки JavaScript?

Это должно помочь вам понять, почему каждый говорит вам поставить var something = this выше функции и использовать something внутри нее, чтобы поддерживать ссылку на оригинал.

Вот скрипка, которая показывает, используя локальную копию этого:

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

В этом случае this и « self – одно и то же, но использование « self безопасно.

«this» представляет вашу функцию в этой области.

пытаться :

 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? } }; } 

Обратите внимание, что назначение этого “” в “то”