8

如何定义一对在 Javascript 中相互调用的函数,以便 JS-lint 在定义之前不会抱怨正在使用“阶乘”?

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

似乎没有可以满足 JSlint 的有效排序。(一个可以嵌入另一个,但这对于所有相互调用的函数集合来说将是一场噩梦)。

这肯定是由语言处理的吧?这只是 JSlint 中的一个错误吗?(这个问题一定在某处得到了回答,但我找不到!)

4

3 回答 3

7

函数内部的引用在执行之前不会被解析。只要在其中一个函数执行时已经定义了这两个函数,它们就会找到彼此。

如果您想摆脱 JSLint 警告,您可以在之前定义函数的名称:

var factorial;
function factorial1(n) { return factorial(n); }
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); }
于 2013-06-24T06:40:21.177 回答
0

我更喜欢这种语法而不是函数:

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

不会忘记用这种语法“声明”函数。

于 2013-06-24T07:43:19.443 回答
0

解决此问题的另一种方法是将其作为回调函数传递,如下所示:

const factorial1 = (n, callback) => { return callback(n); }
const factorial = (n) => { return n === 0 ? 1 : n * factorial1(n - 1, factorial ); }
于 2018-11-07T08:59:57.290 回答