Доступ к этому из встроенной функции объекта - PullRequest
18 голосов
/ 28 августа 2010

Мне трудно ссылаться на "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 из функции отправки? Я также использую jQuery, если это имеет значение.

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

 init : function(){

    this.testObject.submit = this.submitForm;

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

     .
     .
     .

     return valid; 
 }

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

Ответы [ 4 ]

36 голосов
/ 28 августа 2010

Обычный способ - присвоить this, который вы хотите, локальной переменной.

init: function() {
   var _this = this;
   this.testObject.submit(function() {
        console.log(_this.testVariable); // outputs testVariable 
   });
}
7 голосов
/ 25 мая 2016

Вы также можете сделать это, используя функции стрелок ES6:

init: function(){
    this.testObject.submit( () => {
        console.log(this.testVariable);
    }
}

Функции стрелок фиксируют значение this окружающего контекста, избегая необходимости назначать this новой переменной или использовать связанные функции.

1 голос
/ 28 августа 2010

Вы можете получить доступ к переменной oThis только из контекста объекта, который потерян, потому что вы находитесь внутри другой функции. или путем создания нового объекта. как это

var testInstance = new testObject();

Тогда вы можете получить доступ к этому с помощью:

testInstance.oThis;

но это было бы излишним

Я бы попробовал что-то вроде этого Мэтт:

init: function(){

var self = this; // this allows you to access the parent object from different contexts

this.testObject.submit(function(){

    console.log(self.testVariable);

}
1 голос
/ 28 августа 2010

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

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

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

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

...