2010-10-07 2 views
0

Я писал простую рекурсивную функцию в JavaScript и сталкивался с каким-то действительно странным поведением. Сначала я подумал, что это ошибка в браузере, но я попробовал его в FireFox, Chrome и IE9, и все они ведут себя точно так же.Может кто-нибудь объяснить эту загадку JavaScript?

В приведенном ниже HTML-файле выполняется простая функция JS при загрузке страницы. Функция рекурсивна (вызывает себя ровно один раз). По сути, функция создает новый объект Array и возвращает его. Странно то, что после того, как функция вызывает себя рекурсивно, х и у ссылаются на один и тот же объект, который, насколько я понимаю, не должен происходить. Также, если вы раскомментируете последнюю строку перед , возвращаете x, предупреждение «x == y» предупреждение не отображается.

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>JavaScript weirdness...</title> 
<script type="text/javascript" language="javascript"> 
    function RecursiveF(n) { 
     x = [ n ]; 

     if (n > 0) { 
      y = RecursiveF(n - 1); 
      if (x == y) 
       alert('x == y'); 
     } 

     //if (n == 0) return [ n ]; 

     return x; 
    } 
</script> 
</head><body onload="javascript:RecursiveF(1);"></body></html> 

Любые намеки почему «х == у» предупреждение появляется на этой странице?

ответ

1

Вам нужна локальная переменная.

var x = [ n ]; 
7

x и y являются по умолчанию глобальные переменные, разделяемые всеми рекурсивными вызовами функции. Если вы хотите, чтобы они были локальными, объявите их с ключевым словом var.

0

Как утверждают ребята, проблема в том, что x и y не являются локальными переменными, а глобальными. Почему это вызывает конфликт прямо сейчас?

Что делает JavaScript, когда он выполняет вашу функцию, вытаскивает x и y в функцию, которая вызывает функцию и объявляет их там. Итак, теперь x и y находятся на одном уровне. Таким образом, в точке, где вы пишете:

y = RecursiveF(n - 1) 

, что произойдет в конце концов, что

return x; 

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

x == y 

Там вы идете. Объявив x и y как локальные переменные через инструкцию var, вы можете это преодолеть. Таким образом вы получаете новые представления о них с каждым вызовом функции, а затем перезаписываете их.

Смежные вопросы