It’s that space in memory where the engine saves values under the variable names so when they are called from the call-stack this will have a direct link to those values.
Complex variables have different spaces within the memory heap.
Personal Opinion: I think the Engine first read and situate the variables and functions inside the memory heap to late on when used this will have a faster workflow than interpreting as it did before with “var”.
The call-stack simply said is the list of duties the engine must resolve starting always with the global object until the last problem in our code.
Inside a duty can be a local problem, something like “secondary missions” where there are local variables that are not relevant for the main object but important to resolve the duty. This is called scope.
In JavaScript exist a mark by default to erase the variables “mark-sweep” and values that we don’t use again or we overwrite. An example can be when a variable is redeclared or inside a low scope like a function where the variables are periodic.
In other languages is the coder who must mark this variable and erase them to avoid a called “overflow”, literally massive storage of variables within the “memory heap”.
Stack overflow is the situation when the petitions made are massive so it can collapse the memory of the browser. Nowadays with V8, there is a limit of duties in the call-stack avoiding with it crashes issues.
Also “Stack Overflow” is a platform for coders to ask and resolve questions about programming issues.
As it’s seen JavaScript is synchronous, which means it can only do one task at a time so it can make the process slow if there is one duty that needs more time than others.
Apart from the “heap memory” and the “call-stack” we have the APIs, in this case, are tasks that the engine will do once the “call-stack” is done.
JavaScript is synchronous but this can make the language slow, so for that, it can relate some specific tasks like petitions or wait times to the browser so meanwhile relevant tasks in the call-stack are being done the browser can complete the rest. This is an asynchronous in JavaScript.
Something important to notice is that those tasks that remains in the call-stack are the main ones to complete by the engine and finally it will take the duties from the browser “call-back queue”. This is the last process is called “event loop”, it’s basically the constant watch on the “call-stack” to finally send the results in the “call-back queue”.