Возможный дубликат:
В 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
внутри нее, чтобы поддерживать ссылку на оригинал.
Вот скрипка, которая показывает, используя локальную копию этого:
В этом случае 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? } }; }
Обратите внимание, что назначение этого “” в “то”