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

Mes*_*fci 6 javascript

let sayBye = function () {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

Run Code Online (Sandbox Code Playgroud)

在问这个问题之前,我在谷歌搜索,我找到了这篇文章。

然后我想,在第 X 行之前,结构类似于这样:


sayBye ---------------                                              
                      |      
                      |  => function() {....}
                      |
bye-------------------

Run Code Online (Sandbox Code Playgroud)

x线之后,我以为是这样的:

sayBye                        MEMORY                                      
                            
                      |  => function() {....}
                      |
bye-------------------

Run Code Online (Sandbox Code Playgroud)

但是当我在 Firefox 开发人员工具中写再见时,我看到了这个

这怎么可能?我写let bye = sayBye;的时候sayBye被复制了吗?

let sayBye = function () {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

Run Code Online (Sandbox Code Playgroud)

sp0*_*00m 5

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names

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

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


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