Доступ к this из инлайн-функции объекта

У меня возникают трудности со ссылкой на "this" из встроенной функции javascript в объектном методе.

var testObject = {
    oThis : this,
    testVariable : "somestring",
    init : function(){

       console.log(this.testVariable); // outputs testVariable as expected

       this.testObject.submit(function(){

            var anotherThis = this;
            console.log(this.testVariable) // undefined
            console.log(oThis.testVariable) // undefined
            console.log(testObject.testVariable) // outputs testVariable 
            console.log(anotherThis.testVariable) // undefined

    }

}

Как мне получить доступ к this.testVariable из функции submit? Я также использую jQuery, если это имеет значение.

Я думаю, не лучший ли это подход - и, возможно, мне следует сделать submit отдельной функцией, а затем ссылаться на нее в строке, например:

 init : function(){

    this.testObject.submit = this.submitForm;

 },
 submitForm : function(){
     // do validation here
     console.log(this.testVariable) // outputs testvariable

     .
     .
     .

     return valid; 
 }

Но это, похоже, тоже не сработало - и я думаю, что пока я просто хочу сохранить функцию submit в строке моего метода init.

18
задан Marcel Korpel 28 August 2010 в 12:09
поделиться

2 ответа

Распространенный способ — присвоить это, которое вы хотите, локальной переменной.

init: function() {
   var _this = this;
   this.testObject.submit(function() {
        console.log(_this.testVariable); // outputs testVariable 
   });
}
38
ответ дан 30 November 2019 в 06:39
поделиться

Переменная this связывается динамически, когда функция — любая функция, независимо от того, где она была определена — вызывается.

Не видя, что должна делать эта функция «отправить» или где она должна использоваться, трудно сказать, как ее изменить. Одна вещь, которую вы могли бы сделать, это определить «submit» в вашей функции «init»:

init: function() {
  // whatever
  var instance = this;
  instance.submitForm = function() {
    console.log(instance.testVariable);
    // ...
  };
}

Пока «init» вызывается изначально с «this», установленным на экземпляр одного из ваших объектов, все должно быть в порядке.

1
ответ дан 30 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: