JavaScript - ссылка на this во внутренней функции - PullRequest
1 голос
/ 14 ноября 2011

Рассмотрим следующий код:

MyClass.prototype.my_func = function () {
    this.x = 10;
    $.ajax({
        // ...
        success: function (data) {
            alert(this.x);
        }
    });
}

Он не работает, так как, очевидно, this не связан с контекстом выполнения замыкания.Я смог обойти это, введя другую переменную:

var _this = this;

И это работает внутри анонимной функции.Но выглядит довольно некрасиво для меня.Есть какой-нибудь хороший способ справиться с этим?

Ответы [ 4 ]

2 голосов
/ 14 ноября 2011

Это может выглядеть уродливым решением для вас, и есть некоторые обходные пути (например, с использованием bind() метода для изменения контекста), но это лучшее решение, которое язнать.

В качестве альтернативы вы можете изменить его на:

var self = this;

или дать ему более осмысленное имя, но было бы лучше (в этом случае) не менять контекст, так как выможет понадобиться когда-нибудь.

1 голос
/ 14 ноября 2011

Для этого можно использовать Function.prototype.bind:

MyClass.prototype.my_func = function () {
    this.x = 10;
    $.ajax({
        // ...
        success: function (data) {
            alert(this.x);
        }.bind(this);
    });
}

Теперь родительская переменная контекста также привязана к анонимной функции.

0 голосов
/ 14 ноября 2011

Закрытие будет иметь доступ ко всем объектам, определенным в контексте его родителя.Поэтому, если у нас есть:

function() {
  var x = 10;
}

, тогда это действительно:

function() {
  var x = 10;

  (function() {
    alert(2*x); // 20
  }())
}

Поэтому, когда вы определяете var _this = this, вы просто определили новую переменную в контексте родительского элемента, которая доступнав закрытии.См. вопрос # 4371333 для получения дополнительной информации об этом "шаблоне".

0 голосов
/ 14 ноября 2011

Синтаксис this обычно относится к объекту , а не к функции.В вашем случае this означает MyClass .

Если вы используете переменную в объекте, вы, вероятно, забыли определить x в MyClass.

Если вы используете переменную ТОЛЬКО в функции, я бы определил мои переменные, используя синтаксис var.Переменные, определенные внутри функции, уничтожаются при завершении функции.

MyClass.prototype.my_func = function () {
    var x = 10;

    $.ajax({
        // ...
        success: function (data) {
            alert(x);
        }
    });
}
...