2013-06-24 10 views
5

W jaki sposób można zdefiniować parę funkcji, które wywołują się nawzajem w JavaScript, aby JS-lint nie skarżył się, że "silnia" jest używana przed zdefiniowaniem?odwołania kołowe między funkcjami javascript

function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

Wygląda na to, że nie ma ważnej kolejności, która spełni wymagania JSlint. (Jeden może być osadzony w drugim, ale byłby to koszmar dla zbioru funkcji, które wszyscy nazywają się nawzajem).

Z pewnością jest to obsługiwane przez prawo do tłumaczenia? Czy to tylko błąd w JSlint? (To pytanie musiało gdzieś zostać odebrane, ale nie mogę go znaleźć!)

+0

Prawdopodobnie miałeś na myśli 'n === 0? 1: ... '. Co też nie działa (z wyjątkiem błędu logicznego, który już wskazałem)? – Dogbert

+0

>> Z pewnością jest to obsługiwane przez prawo języka? Generalnie po pewnym czasie Twoja strona przestaje reagować, a przeglądarka wyświetla komunikat wyskakujący z prośbą o zatrzymanie skryptu lub kontynuację. – mohkhan

+0

@dobert tak, twoja edycja jest poprawna. ale prawdziwym problemem jest to, że JSlint narzeka, że ​​"silnia" jest punktem odniesienia, zanim zostanie zdefiniowana. –

Odpowiedz

6

Odniesienia wewnątrz funkcji nie zostaną rozwiązane, dopóki nie zostaną wykonane. Tak długo, jak obie funkcje zostaną zdefiniowane do czasu, w którym jeden z nich zostanie wykonany, odnajdą się nawzajem.

Jeśli chcesz pozbyć się ostrzeżenia JSLint, można zdefiniować nazwę funkcji, tuż przed:

var factorial; 
function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 
+0

Niestety nie wyjaśniłem, że problem polega na tym, że JS-lint narzeka. –

+0

Dzięki! oczywiście. Nie rozważałem mieszania w funkcji var z nazwanymi funkcjami! –

0

Wolę tę składnię funkcji:

var factorial1 = function(n) { return factorial(n); } 
var factorial = function(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

nie Will być w stanie zapomnieć o funkcji "deklaruj" przy użyciu tej składni.

+0

Wszystkie instrukcje powinny być zakończone średnikami. Nie jest to wielka sprawa, ale może spowodować problemy, jeśli skopiujesz te instrukcje. –

Powiązane problemy