我有一个JavaScript名称空间说
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不是一个函数。有人可以告诉我为什么会这样。我知道这与词汇范围有关,但我无法理解。
答案 0 :(得分:25)
当您使用 this 来识别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'
};
};
答案 1 :(得分:5)
我认为问题是当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;
}
答案 2 :(得分:4)
我真的很惊讶你的代码没有在'C:'行上给你错误。
无论如何,定义函数的语法不正确。使用var关键字定义它。另外,请注意我创建了'闭包',以便函数C可以访问'this'。请参阅以下代码:
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分配给“this”对象,您还可以执行以下操作:
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;
}
}
答案 3 :(得分:0)
从另一个方法调用方法的解决方案。 (基本上必须将指针“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();
此示例显示了如何使用函数实例从另一个方法或外部调用方法。