为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 JavaScript 函数表达式保存在内存中?

如何将 JavaScript 函数表达式保存在内存中?

狐的传说 2023-08-24 10:00:45
let sayBye = function () {    console.log(`Bye`);}let bye = sayBye;   sayBye = null;    // Xbye();            // Y在问这个问题之前,我在谷歌上搜索了一下,发现了这篇文章。然后我想,在 X 行之前,结构类似于这样:sayBye ---------------                                                                    |                            |  => function() {....}                      |bye-------------------x行之后,我认为是这样的:sayBye                        MEMORY                                                                                        |  => function() {....}                      |bye-------------------但是当我在 Firefox 开发者工具中写下再见时,我看到了这个这怎么可能?当我写的时候,let bye = sayBye;sayBye 被复制了吗?let sayBye = function () {    console.log(`Bye`);}let bye = sayBye;   sayBye = null;    // Xbye();            // Yconsole.log(bye);
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞


变量和方法可以从语法位置推断匿名函数的名称(ECMAScript 2015 中的新增功能)。

"sayBye"Chrome 和 Firefox在打印时都会给出bye.name.


bye.toString()根据个人实验,Chrome 控制台会在询问 时显示bye,而 Firefox 会显示他们的自定义输出,其中显示推断的函数名称(这确实有意义,因为知道名称通常有助于调试)。


查看完整回答
反对 回复 2023-08-24
?
四季花海

TA贡献1811条经验 获得超5个赞

函数是对象,因此赋值 x = y 不会被复制。我尝试了这个 Nodejs 我得到


Bye

[Function: sayBye]


如果你没有命名函数,JS 会自动为其添加名称。在 ES6 中,您可以使用 myFunction.name检查函数的名称,即“name”是函数对象的属性。重要的是,这是只读属性。好的做法是使用constwhile letusing 函数表达式。另外,如果可能的话,尝试命名函数,这样在调用堆栈上调试就很容易


查看完整回答
反对 回复 2023-08-24
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您对函数的名称感到困惑。

记忆中的事情发生的方式和你想象的完全一样。

但是,该函数没有显式名称,因此浏览器为该函数提供了一个隐式名称,即首先分配给它的变量或对象属性的名称,在本例中为sayBye.

然后,它被分配给另一个变量,但名称不变。

如果你给它一个明确的名称,你可以看到这一点:


//  Explicit name ----vvvv

let sayBye = function myFn() {

    console.log(`Bye`);

}


let bye = sayBye;   

sayBye = null;    // X


bye();            // Y


console.log(bye);


查看完整回答
反对 回复 2023-08-24
  • 3 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信