JavaScript ссылается на метод внутри метода? - PullRequest
1 голос
/ 07 февраля 2012

Хорошо, только что решена одна проблема, где это указывало на неправильную область действия . Теперь у меня есть другая проблема.

Итак, я хочу вызвать метод , то есть внутри a метод . Но я не знаю как, проверьте этот источник:

function someObj() {
   var self = this;

   this.someMethod1 = function() {
      var elementBtn = document.getElementById('myBtn');

      elementBtn.onclick = function() { 
         self.someMethod2.methodMethod(); 
         //I want this.someMethod2.methodMethod() to be called
         //...but I get an big error instead. Is it even possible?
         //this.someMethod2() works fine.

      };
   };
   this.someMethod2 = function() {
      this.methodMethod = function() {
         alert('THIS IS THE ONE I WANTED!');
      };
      alert('NO, NOT THIS!');
   };
}

Сообщение об ошибке:

Uncaught TypeError: Object function () {...

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

С вашим кодом сначала должно быть выполнено someMethod2 для назначения выражения функции.Даже в этом случае он будет назначен родительскому экземпляру.

Учитывая, что все функции являются объектами в JavaScript, это то, что вы хотите вместо этого:

this.someMethod2 = function() {
   alert('NO, NOT THIS!');
};
this.someMethod2.methodMethod = function() {
   alert('THIS IS THE ONE I WANTED!');
};
2 голосов
/ 07 февраля 2012

Вы пытаетесь использовать объект доступа к функции.Если вы хотите, чтобы он работал таким образом, вам нужно вернуть литерал объекта из вашего вызова во "внешнюю" функцию.

this.someMethod2 = function() {
  return {
    methodMethod: function() {
      alert('THIS IS THE ONE I WANTED!');
    }
  }
};

Затем вы можете связать вызов.self.someMethod2().methodMethod();

0 голосов
/ 07 февраля 2012
function someObj() {
    var self = this;

    this.someMethod1 = function () {
        var elementBtn = document.getElementById('myBtn');

        elementBtn.onclick = function () {
            self.someMethod2().methodMethod();
        };
    };
    this.someMethod2 = function () {
        this.methodMethod = function () {
            alert('THIS IS THE ONE I WANTED!');
        };
        //return this for chain method.
        return this;
    };
}
0 голосов
/ 07 февраля 2012

пытается

function someObj() {
 var self = this;

 this.someMethod1 = function() {
  var elementBtn = document.getElementById('myBtn');
  elementBtn.onclick = function() { 
      self.someMethod2().methodMethod(); 
  };

 this.someMethod2 = function() {

  this.methodMethod = function() {
     alert('THIS IS THE ONE I WANTED!');
  };
  alert('NO, NOT THIS!');
  return this;
 };
}

Также, если вы используете прототип , тогда

function someObj() {
 var self = this;

  this.someMethod1 = function() {
    var elementBtn = document.getElementById('myBtn');
    elementBtn.onclick = function() { 
      self.someMethod2.methodMethod();//['methodMethod'](); 
    };
   };

   this.someMethod2 = function() {


 };
 this.someMethod2.methodMethod = function() {
     alert('THIS IS THE ONE I WANTED!');
   };
 };

Но метод methodMethod является статическим

0 голосов
/ 07 февраля 2012

Хотя это невозможно сделать напрямую, вы можете передать «команду» внешней функции, чтобы сказать ей выполнить внутреннюю функцию. Но вы уверены, что это то, что вам действительно нужно? Возможно, вам следует использовать объекты вместо функций здесь. Но вот «командный» путь:

this.someMethod2 = function(cmd) {
    var methodMethod = function() {
        alert('THIS IS THE ONE I WANTED!');
    };

    if (cmd === "methodMethod") {
        methodMethod();
        return;
    }

    alert('NO, NOT THIS!');
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...