Представление памяти функций в javascript

Функции рассматриваются как объекты в 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. Но это не изменилось. Помогите мне визуализировать, как здесь все работает. Представление памяти функций в javascript

Я не мог найти ни одной книги, которая бы так объясняла js.

ваша функция sayHi() всегда будет возвращать "test2.html:7 Привет! Оценка 12"

Ed Bangga 17.07.2019 07:45

Но я изменил значение score с помощью sayHi3.score=24.

Tanzeel 17.07.2019 07:47

Функции рассматриваются как объекты, но score не является свойством sayHi, поэтому sayHi3.score = 24 не повлияет на него.

Titus 17.07.2019 07:48

вы снова объявили счет "var score=12";

Ed Bangga 17.07.2019 07:49

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

Rinkesh Golwala 17.07.2019 07:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
500
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Внутри функции вы объявляете счет равным 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>

Не совсем понял, какова ваша цель. Надеюсь, это поможет.

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

Ответ принят как подходящий

Да, данное представление памяти подходит для «функций как объектов». У вас есть указатель в стеке, который будет указывать на фактический объект функции в куче. Но функциональные объекты немного отличаются от обычных объектов.

См. код ниже

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, к объекту функции.

We can roughly represent this as follows:

Другие вопросы по теме