0

鉴于此代码:

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

这究竟是做什么的?为什么它不创建递归调用?

4

2 回答 2

3

这可能会创建一个递归:

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

但是在那里,没有括号,foo不会被执行。测试只检查变量foo不评估为真,然后用 boolean 替换它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
于 2013-05-04T19:14:26.233 回答
0

它没有调用自己,只是检查该名称的变量是否存在/是真实的。该函数可以重命名,并且 foo 可以在调用时完全引用其他内容。

所以要清楚,递归发生在函数调用自身时

function foo(){

  foo();

}

而您所做的只是查找 foo 的当前值而不尝试调用它。

!foo  //if foo is defined as a function or other truthy object, is true
于 2013-05-04T19:18:36.940 回答