2013-10-06 3 views
2

Почему эта функция возвращает undefined?Почему эта рекурсивная функция javascript не возвращает правильное значение

Внутренняя функция возвращает правильное значение.

function arraySum(i) { 

    // i will be an array, containing integers, strings and/or arrays like itself. 
    // Sum all the integers you find, anywhere in the nest of arrays. 

    (function (s, y) { 
     if (!y || y.length < 1) { 
      //console.log(s); 
      // s is the correct value 
      return s; 
     } else { 
      arguments.callee(s + y[0], y.slice(1)); 
     } 
    })(0, i); 
} 

var x = [1, 2, 3, 4, 5]; 
arraySum(x); 
+3

Вы не возвращают 'arguments.callee (...)'. –

+0

ОК, поэтому я переписал его с названной функцией, и теперь он работает. 'function arraySum (i) { Функция acc (s, y) { if (! y || y.length <1) { //console.log(s); // s - правильное значение return s; } else { return acc (s + y [0], y.slice (1)); } return acc (0, i); } var x = [1, 2, 3, 4, 5]; console.log (arraySum (x)); ' – hiester

+0

Я рекомендую не использовать' arguments.callee' или 'arguments.caller'; он будет удален в ECMAScript 6 и уже недоступен в строгом режиме ECMAScript 5. –

ответ

0

Если то, что вы сказали в комментарии Кодекса верно, это что вам нужно.

function arraySum(i) { 

    // i will be an array, containing integers, strings and/or arrays like itself 
    // Sum all the integers you find, anywhere in the nest of arrays. 

    return (function (s, y) { 
     if (y instanceof Array && y.length !== 0) { 
      return arguments.callee(arguments.callee(s, y[0]), y.slice(1)); 
     } else if (typeof y === 'number') { 
      return s + y; 
     } else { 
      return s; 
     } 
    })(0, i); 
} 

Выход

var x = [1, 2, 3, 4, 5]; 
console.log(arraySum(x)); 
x = [1, 2, [3, 4, 5]]; 
console.log(arraySum(x)); 
x = [1, "2", 2, [3, 4, 5]]; 
console.log(arraySum(x)); 
x = [1, "2", [2, [3, 4, 5]]]; 
console.log(arraySum(x)); 
+0

I должен был удалить эти комментарии. Это часть викторины, над которой я все еще работал. – hiester

1

Изменить его

return arguments.callee(s + y[0], y.slice(1)) 

Или просто использовать уменьшить :-):

[1,2,3,4].reduce(function(sum, x) { return sum + x; }, 0); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

+2

«Возврат» также необходим перед IIFE. 'return (function (s, y) {...' – user2736012

+1

Почему вы передаете второй аргумент для уменьшения? Нет необходимости. –

+0

Это начальное значение, которое передается первому аргументу для обратного вызова. Это для ясности. – chubbsondubs

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