调用栈
是解析器的一种机制
当脚本要调用一个函数时,解析器把该函数添加到栈中并且执行这个函数。
任何被这个函数调用的函数会进一步添加到调用栈中,并且运行到它们被上个程序调用的位置。
当函数运行结束后,解释器将它从堆栈中取出,并在主代码列表中继续执行代码。
如果栈占用的空间比分配给它的空间还大,那么则会导致“栈溢出”错误。
原文地址:https://developer.mozilla.org...
JavaScript是单线程语言,也就是说它只有一个调用栈。
- 调用栈记录程序运行情况。调用函数会在栈的顶部,返回函数会弹出栈。
- 栈溢出: 超过栈的最大空间
执行上下文
有三种
- 全局执行上下文(1、都有一个全局对象,在浏览器中一般为window。2、此时,this会指向全局对象,浏览器中一般为window)
-
函数执行上下文(每个函数创建都会有一个新的执行上下文)
在非严格模式下,this指向全局对象。 在严格模式下,this将保持他进入执行上下文时的值
- Eval()执行上下文(不常用,不讨论)
变量提升
“提升”至顶部,实际上是,变量和函数声明在编译时放进了内存。
仅仅是声明被提升。
原因是:执行上下文的方式
总结
JS解析器开始执行:
创建一个执行上下文栈
- 执行全局的执行上下文,并放入执行上下文栈中
- 调用函数时,创建函数执行上下文栈,放入函数,执行完弹出。
保证单线程。
执行上下文创建分成两个阶段:
创建阶段: 将所有的变量,函数声明以及函数参数 组成一个活动对象 执行阶段: 解释代码.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。