函数如何在 JavaScript 中引用自身?

Posted

技术标签:

【中文标题】函数如何在 JavaScript 中引用自身?【英文标题】:How can function reference itself within itself in JavaScript? 【发布时间】:2021-05-23 20:23:40 【问题描述】:

我从代码的执行方式以及您可能需要它的原因来理解递归。我想知道的是,函数是否有可能在自身内部引用自身?

举个例子:

function factorial(num) 
  if(num ===0) 
    return 1
  
  return (num * factorial(num - 1));


factorial(2)

我想了解变量如何存储在内存中以及如何调用它们以及为什么可以在 factorial 函数中引用 factorial 的幕后情况。

目前我理解的执行方式:

    在堆栈上声明一个函数factorial,它将引用堆上的一个对象。此时factorial仍然指向无处 在将计算阶乘的堆(函数)上创建一个对象 调用factorial(2),它将获取factorial指向的堆栈上的引用,在堆上找到函数并调用它。

我不明白的是,当factorial 被调用时,它会知道factorial 是什么以及在哪里可以找到它?它是否与闭包有关?

另一个例子(开玩笑)

  const someFunction = jest.fn((value) => 
    expect(someFunction).toHaveBeenCalled()
  )

为什么我可以在someFunction 中引用someFunction,如上所述,我怀疑它与内存以及变量的存储方式有关,但我没有完全掌握这个概念。,

【问题讨论】:

【参考方案1】:

Function Guide of the MDN Web Docs 包含您寻找的信息。有多种方法可以从函数体内引用函数。归结为一个事实,即

一个函数可以访问其定义范围内定义的所有变量和函数

您可以将其理解为一个函数可以访问在其定义范围内定义的所有内容。这包括它自己。

【讨论】:

【参考方案2】:

通过使用命名函数声明/expression,调用检查函数的内部范围,如果不在内部,则检查被调用函数的名称,然后检查外部范围。

但是,名称可以与函数表达式一起提供。提供名称允许函数引用自身,也可以更容易地在调试器的堆栈跟踪中识别函数

通过使用arrow functions,函数的名称不会被设置,并且不会通过重命名为命名函数声明的对面而保留,其中名称始终可以从内部范围调用。

【讨论】:

以上是关于函数如何在 JavaScript 中引用自身?的主要内容,如果未能解决你的问题,请参考以下文章

javascript --- 递归的简单理解

如何简化将自身作为参数引用的函数? (这是啥意思)

如何在 Javascript 中找到函数的源代码?

JavaScript 函数调用

JavaScript之arguments

关于javascript函数变量作用域问题