Вызов метода внутри другого метода в javascript?

У меня есть пространство имен JavaScript say

A={

  CA: function() {
    this.B();
  },
  B: function() {
    var test='test';
    var result='t1';

    C: function() {
      this.test='test1';
      .....
      .....
      return 'test1';    
    }

   result=this.C();  
   return result; 
  }
}

теперь, когда я выполняю такой код, он дает этот TypeError: this.C не является функцией. Может кто-нибудь сказать мне, почему это так. Я знаю, что это связано с лексическим охватом, но я не могу этого понять.

4 ответов


Я думаю, проблема в том, что когда this.C() выполняется внутри функции, на которую ссылается B, this относится к объекту, который содержит B, то есть объект A. (Это предполагает B() вызывается в контексте A)

проблема C не существует на объекте A, так как он определен в B. Если вы хотите вызвать локальную функцию C() внутри B, просто использовать C().

изменить: Кроме того, я не уверен, что вы опубликовали действительный JavaScript. В частности, B должно быть определено таким образом, так как вы не можете использовать синтаксис object:property внутри функции.

B: function()
{
  var test='test';
  var result='t1';

  var C = function()
  {
    this.test='test1';
    return 'test1';    
  }

 result=C();  
 return result; 
}

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

назначение ссылки "this" на собственную переменную помогает обойти это.

var a = new function() {
    var self = this;

    self.method = function() { alert('hiya'); };

    var b = function() {
        this.method(); // this isn't 'a' anymore?
        self.method(); // but 'self' is still referring to 'a'
    };

};

Я действительно удивлен, что ваш код не дает вам ошибку в строке " C:".

в любом случае, ваш синтаксис для определения функции неверен. Определяют его с помощью ключевого слова var. Кроме того, обратите внимание, что я создал "закрытие", чтобы функция C могла получить доступ к "этому". См. код ниже:

A={

  CA: function()
  {
    this.B();
  },

  B: function()
  {
    var test='test';
    var result='t1';

    var self = this;
    var C = function()
            {
              self.test='test1';
              .....
              .....
              return 'test1';    
            }

   result=C();
   return result; 
  }
}

Если вы хотите назначить c "этому" объекту, вы также можете сделать:

A={

  CA: function()
  {
    this.B();
  },

  B: function()
  {
    var test='test';
    var result='t1';

    var self = this;
    this.C = function()
             {
              self.test='test1';
              .....
              .....
              return 'test1';    
             };

   result= this.C();
   return result; 
  }
}

решение для вызова методов из другой метод. (По существу, указатель "this" должен быть назначен переменной и новой переменной, используемой вместо этого.)

 function myfunction(){
    var me = this;

    me.method1 = function(msg){ alert(msg); }

    me.method2 = function(){ 
       me.method1("method1 called from method2"); 
    }
 }

 var f as new myfunction();
 f.method2();

в этом примере показано, как можно вызвать метод изнутри другого метода или извне, используя экземпляр функции.