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

let sayBye = function () {

    console.log(`Bye`);

}


let bye = sayBye;   

sayBye = null;    // X


bye();            // Y


在问这个问题之前,我在谷歌上搜索了一下,发现了这篇文章。


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



sayBye ---------------                                              

                      |      

                      |  => function() {....}

                      |

bye-------------------


x行之后,我认为是这样的:


sayBye                        MEMORY                                      

                            

                      |  => function() {....}

                      |

bye-------------------


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

https://img3.mukewang.com/64e6ba140001a07503180075.jpg

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


let sayBye = function () {

    console.log(`Bye`);

}


let bye = sayBye;   

sayBye = null;    // X


bye();            // Y


console.log(bye);


狐的传说
浏览 176回答 3
3回答

函数式编程

变量和方法可以从语法位置推断匿名函数的名称(ECMAScript 2015 中的新增功能)。"sayBye"Chrome 和 Firefox在打印时都会给出bye.name.bye.toString()根据个人实验,Chrome 控制台会在询问 时显示bye,而 Firefox 会显示他们的自定义输出,其中显示推断的函数名称(这确实有意义,因为知道名称通常有助于调试)。

四季花海

函数是对象,因此赋值 x = y 不会被复制。我尝试了这个 Nodejs 我得到Bye[Function: sayBye]如果你没有命名函数,JS 会自动为其添加名称。在 ES6 中,您可以使用 myFunction.name检查函数的名称,即“name”是函数对象的属性。重要的是,这是只读属性。好的做法是使用constwhile letusing 函数表达式。另外,如果可能的话,尝试命名函数,这样在调用堆栈上调试就很容易

MMMHUHU

您对函数的名称感到困惑。记忆中的事情发生的方式和你想象的完全一样。但是,该函数没有显式名称,因此浏览器为该函数提供了一个隐式名称,即首先分配给它的变量或对象属性的名称,在本例中为sayBye.然后,它被分配给另一个变量,但名称不变。如果你给它一个明确的名称,你可以看到这一点://  Explicit name ----vvvvlet sayBye = function myFn() {    console.log(`Bye`);}let bye = sayBye;   sayBye = null;    // Xbye();            // Yconsole.log(bye);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript