Вызов метода внутри другого метода в 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();
в этом примере показано, как можно вызвать метод изнутри другого метода или извне, используя экземпляр функции.