javascript对象递归函数

javascript对象递归函数,javascript,recursion,yui,Javascript,Recursion,Yui,Hi all我在yui对象中具有以下功能: fun1: function (x){ .... if (condition) this.fun1(x-1); } 但我在调试模式下看到指令this.fun1(x-1)引发错误: 未捕获类型错误:未定义不是函数 如何解决呢 在用于定义对象的对象文字符号中,请避免使用此符号,因为它指的是窗口对象。相反,您可以使用正在创建属性的对象名,如 var obj = { testfunction: function() {

Hi all我在yui对象中具有以下功能:

fun1: function (x){
    ....
    if (condition)
        this.fun1(x-1);
}
但我在调试模式下看到指令
this.fun1(x-1)
引发错误: 未捕获类型错误:未定义不是函数
如何解决呢

在用于定义对象的对象文字符号中,请避免使用此符号,因为它指的是窗口对象。相反,您可以使用正在创建属性的对象名,如

var obj = {
   testfunction: function() {
        obj.testfunction();
   }
};

在用于定义对象的对象文字符号中,避免使用此符号,因为它引用窗口对象。相反,您可以使用正在创建属性的对象名,如

var obj = {
   testfunction: function() {
        obj.testfunction();
   }
};

确保调用正确函数的最佳方法是不要依赖此函数,也不要使用匿名函数。给函数一个临时名称,并像这样调用它

var obj ={
fun : function Q(a){
    if(a>0){
        return Q(a-1) + a;
    }
    return 0;
  }
}
如果为了递归只使用一个大写字母来称呼它,那么通常使用一个大写字母来称呼它

尝试并始终为函数命名,因为这样更容易调试(函数名将出现在调用跟踪中)


请注意,在javascript中使用递归可能是危险的,因为javascript没有尾部调用优化,如果不小心,您可以很容易地运行堆栈溢出。

确保调用正确函数的最佳方法是不依赖此函数,也不使用匿名函数。给函数一个临时名称,并像这样调用它

var obj ={
fun : function Q(a){
    if(a>0){
        return Q(a-1) + a;
    }
    return 0;
  }
}
如果为了递归只使用一个大写字母来称呼它,那么通常使用一个大写字母来称呼它

尝试并始终为函数命名,因为这样更容易调试(函数名将出现在调用跟踪中)



请注意,在javascript中使用递归可能是危险的,因为javascript没有尾部调用优化,如果不小心,很容易运行堆栈溢出。

从您提供的简明代码片段中不太清楚
if
条件下,此
绑定到什么。您是否100%确定它指向您认为
fun1
中定义的同一对象?
是在调用时定义的,您需要查看第一次调用
fun1
的位置如果您想知道
的值,请提供完整的代码,包括定义
fun1
的对象的定义,以及如何调用它。从您提供的简明代码片段中,不太清楚在
if
条件下该
绑定到什么。您是否100%确定它指向您认为
fun1
中定义的同一对象?
是在调用时定义的,您需要查看第一次调用
fun1
的位置如果您想知道
的值,请提供完整的代码,包括定义
fun1
的对象的定义,以及如何调用它。这种情况下
this
不会是
window
,因为它位于对象文本的属性中,
var foo={bar:function(){return this;};foo.bar()==foo;//true
这是一个可怕的想法,因为它将
testfunction
的行为与它被定义为其一部分的特定对象绑定在一起;foo.bar()==foo;//true
这是一个可怕的想法,因为它将
testfunction
的行为与定义为其一部分的特定对象绑定。如果
Q
引用该对象的其他属性,则此想法将失败。感谢您的评论。因为这个原因,你用单大写字母来命名它,我不明白单大写和单大写的命名有什么关系。我的问题是,假设
Q
函数指的是
this.val
。您对
Q(a-1)
的调用不会传递任何
this
,因此调用函数中对
this.val
的引用将失败。您需要执行
Q.call(this,a-1)
以确保不会发生这种情况。但是如果你打算使用
this
,你也可以使用
this.fun(a-1)
。现在我们回到OP最初的问题,为什么它不起作用,你的答案是…什么?对不起,我不明白你的评论,现在它清楚了。你完全正确,如果你引用对象的其他属性,它将没有帮助,但我认为这不是最初的问题。如果
Q
引用对象的其他属性,这个想法将失败。谢谢你的评论。因为这个原因,你用单大写字母来命名它,我不明白单大写和单大写的命名有什么关系。我的问题是,假设
Q
函数指的是
this.val
。您对
Q(a-1)
的调用不会传递任何
this
,因此调用函数中对
this.val
的引用将失败。您需要执行
Q.call(this,a-1)
以确保不会发生这种情况。但是如果你打算使用
this
,你也可以使用
this.fun(a-1)
。现在我们回到OP最初的问题,为什么它不起作用,你的答案是…什么?对不起,我不明白你的评论,现在它清楚了。你完全正确,如果你引用对象的另一个属性,它将不会有帮助,但我不认为这是最初的问题。