鉴于此代码:
function foo()
{
if (!foo)
{
//blah blah blah some code here
foo = true;
}
}
这究竟是做什么的?为什么它不创建递归调用?
鉴于此代码:
function foo()
{
if (!foo)
{
//blah blah blah some code here
foo = true;
}
}
这究竟是做什么的?为什么它不创建递归调用?
这可能会创建一个递归:
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
它没有调用自己,只是检查该名称的变量是否存在/是真实的。该函数可以重命名,并且 foo 可以在调用时完全引用其他内容。
所以要清楚,递归发生在函数调用自身时
function foo(){
foo();
}
而您所做的只是查找 foo 的当前值而不尝试调用它。
!foo //if foo is defined as a function or other truthy object, is true