2013-05-04 4 views
0

Учитывая этот код:Почему этот код не приводит к рекурсии?

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

Что именно это сделать? Почему это не создает рекурсивный вызов?

+5

Функциональный объект должен быть * вызван/вызван/применен * - например. с '()' - для рекурсии. Помните, что функции в JavaScript - это просто объекты. Выражение 'foo' просто оценивает значение (которое здесь является объектом функции), тогда как' foo() 'оценивает foo, а затем применяет оператор функции (который будет« вызывать foo »). – user2246674

ответ

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

yep, хороший пример того, о чем я думал в своем ответе. –

+0

Не так просто сразу приступить к такому примеру, как любой здравомыслящий кодер не пишет такой код, чтобы начать с ... –

+0

Я занимаюсь кодированием Test Automation в JavaScript в течение 8 лет, и сегодня это первый Я все время видел эту конструкцию, и это ошеломило мой разум. –

0

Его не называя себя, просто проверяя, что переменная по это имя существует/правдиво. Функция может быть переименована, и foo может ссылаться на что-то еще полностью к моменту ее вызова.

Так быть ясно, рекурсия возникает, когда функция вызывает себя

function foo(){ 

    foo(); 

} 

а то, что вы делаете, просто глядя вверх текущее значение обув, не пытаясь вызвать его.

!foo //if foo is defined as a function or other truthy object, is true 
Смежные вопросы