Функции рассматриваются как объекты в javascript. Я до сих пор не могу визуализировать и связать вещи. Что происходит под капотом. Я написал некоторый код и нарисовал представление памяти в соответствии с моим пониманием.
<script type = "text/javascript">
function sayHi() {
var score=12;
console.info("Hi! the score is " +score);
}
sayHi();
var sayHi2 = sayHi;
sayHi2();
var sayHi3=sayHi;
sayHi3.score=24;
sayHi();
</script>
Я думал, что sayHi3.score=24 изменится score=12 на score=24. Но это не изменилось. Помогите мне визуализировать, как здесь все работает.

Я не мог найти ни одной книги, которая бы так объясняла js.
Но я изменил значение score с помощью sayHi3.score=24.
Функции рассматриваются как объекты, но score не является свойством sayHi, поэтому sayHi3.score = 24 не повлияет на него.
вы снова объявили счет "var score=12";
Когда вы вызываете функцию sayHi, вы объявляете var score = 12. Для функции 3, где вы определяете sayHi3.score = 24, она будет храниться в конструкторе. Попробуйте проверить sayHi.prototype объект. Там в конструкторе вы найдете созданную вами партитуру.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Внутри функции вы объявляете счет равным 12. Таким образом, каждый раз, когда функция вызывает счет, он равен 12.
Если вы хотите установить переменную с другим значением, вы можете сделать что-то вроде этого:
<script type = "text/javascript">
var score=12; // move out from the function
function sayHi() {
console.info("Hi! the score is " +score);
}
sayHi(); // score = 12
var sayHi2 = sayHi;
sayHi2(); // score is still 12
var sayHi3=sayHi;
score=24; // now score is 24
sayHi3(); // print 24
</script>
Не совсем понял, какова ваша цель. Надеюсь, это поможет.
Да, данное представление памяти подходит для «функций как объектов». У вас есть указатель в стеке, который будет указывать на фактический объект функции в куче. Но функциональные объекты немного отличаются от обычных объектов.
См. код ниже
function sayHi() {
var score=12;
console.info("Hi! the score is " +score);
}
var score=12 — локальная переменная function sayHi(). Такие новички, как я, могут спутать его со свойством. Итак, во-первых, локальная переменная и свойство — это две разные вещи. Поскольку функции рассматриваются как объекты, вы можете добавлять свойства к объектам функций.
Код ниже добавляет новое свойство к объекту функции
function sayHi() {
var score=12;
console.info("Hi! the score is " +score);
}
sayHi.newProp='hello'; // Adding property to the function object
Итак, здесь var score=12 — локальная переменная, а newProp='hello' — свойство.
Чтобы подтвердить, было ли свойство успешно добавлено или нет. Давайте запустим код ниже. Я создам новый указатель, который будет указывать на тот же объект функции, на который указывал sayHi.
function sayHi() {
var score=12;
console.info("Hi! the score is " +score);
}
sayHi.newProp='hello';
/*Create a new pointer pointing to the same object*/
var obj=sayHi;
console.info(obj.newProp);
Выход
Hi! the score is 12
hello
obj.newProp печатает hello, потому что sayHi.newProp='hello'; удалось добавить новое свойство, то есть newProp, к объекту функции.
ваша функция sayHi() всегда будет возвращать "test2.html:7 Привет! Оценка 12"