2013-05-04 68 views
0

鉴于这种代码:这段代码为什么不导致递归?

function foo() 
{ 
    if (!foo) 
    { 
    //blah blah blah some code here 
    foo = true; 
    } 
} 

究竟该做些什么呢?为什么不创建递归调用?

+5

必须调用/调用/应用函数对象。用'()' - 递归发生。请记住,JavaScript中的函数只是对象。表达式'foo'只是求值(在这里是一个函数对象),而'foo()'计算foo,然后应用函数运算符(它将“调用foo”)。 – user2246674 2013-05-04 19:15:26

回答

3

这可能会创建一个递归:

function foo() 
{ 
    if (!foo()) // <=== notice the() 
    { 
    //blah blah blah some code here 
    foo = true; 
    } 
} 

但是,如果没有括号,foo不执行。测试仅检查变量foo未评估为真,然后用布尔值true替换它。这是一个奇怪的代码,但不是递归。

请注意,我们不知道,里面的功能,即foo是功能,代码可能是这样的:

function foo() { 
    if (!foo) 
    { 
    //blah blah blah some code here 
    foo = true; 
    } 
}  
var f = foo; 
foo = 0; 
f(); // this would result in foo being true 
+0

是的,我在回答中想到的很好的例子。 – 2013-05-04 19:19:54

+0

马上就不会有这么简单的例子,因为任何理智的编码器都不会编写这种类型的代码... – 2013-05-04 19:20:38

+0

我一直在JavaScript中测试自动化编码8年,今天是第一个我曾经见过这样的结构,这使我很难理解。 – 2013-05-04 19:27:36

0

它不是自称,只是检查地看到,通过可变那个名字存在/是真的。该函数可以重命名,foo可以在被调用的时候完全引用其他东西。

所以要清楚,当一个函数调用自身发生递归

function foo(){ 

    foo(); 

} 

,而你正在做的是刚刚抬头foo的电流值,而不尝试调用它。

!foo //if foo is defined as a function or other truthy object, is true 
相关问题