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

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

bye();            // Y

Прежде чем задать этот вопрос, я поискал в Google и нашел это пост.

Затем я подумал, что до строки X структура похожа на эту:


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

После X Line я думал, что это было так:

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

Но когда я написал до свидания в инструментах разработчика Firefox, я увидел это

Как это возможно? Когда я писал {{x0}} - это коппин Saybye?

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

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

bye();            // Y

console.log(bye);
6
Mesut Çifci 23 Ноя 2020 в 13:46

3 ответа

Лучший ответ

Из 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 показывает собственный вывод, в котором они отображают выведенное имя функции (что действительно имеет смысл, поскольку обычно зная имя помогает отладка).

5
sp00m 23 Ноя 2020 в 11:19

Вас смущает название функции.

В памяти все происходит точно так же, как вы думали.

Однако у функции не было явного имени, поэтому браузер выдал неявное имя функции, то есть имя переменной или свойства объекта, которому она была первым назначена, в данном случае {{X0} }.

Затем он присваивается другой переменной, но имя не меняется.

Вы можете увидеть это, если дадите ему явное имя:

//  Explicit name ----vvvv
let sayBye = function myFn() {
    console.log(`Bye`);
}

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

bye();            // Y

console.log(bye);
2
FZs 23 Ноя 2020 в 11:16

Функции являются объектами, поэтому присвоение x = y не копируется. Я попробовал этот Nodejs, который получил

Bye
[Function: sayBye]

Если вы не называете функцию, JS автоматически добавит ей имя. В ES6 вы можете проверить имя функции, используя myFunction.name , т.е. «name» - это свойство объекта функции. Важно то, что это свойство только для чтения . Хорошей практикой является использование const вместо let при использовании выражения функции. Кроме того, если возможно, попробуйте назвать функцию отладкой легко в стеке вызовов

3
Ranjeet Thorat 23 Ноя 2020 в 11:43
64966899