文章参考:
https://time.geekbang.org/column/article/126339
https://github.com/mqyqingfeng/Blog/issues/4
执行上下文
定义:当 JavaScript 代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。
调用栈
调用栈是javascript引擎追踪函数执行的一个机制,通过调用栈就能够了解函数之间的调用关系。javascript利用栈这种数据结构管理执行上下文。
var a = 0;
function add(a + b) {
returan a + b;
}
function sum(c) {
return c + add(2, 3);
}
sum(a);
以上代码执行调用栈如下:
调用栈
可以看到调用栈如果不能有序退出那么就会造成栈溢出,这种情况一般会发生在递归调用结束条件有问题情况等等。
块级作用域
作用域决定了代码区块中变量和其他资源的可访问性。
ES6 之前javascript没有块级作用域,只有全局作用域和函数作用域。var、let、const是js定义变量的三个关键词,其中var和let、const有本质不同。let 和 const 都是es6语法。两者都支持块级作用域,并没有变量提升现象,即:不会再编译阶段将声明放置到代码顶部。而在javascript为了加入块级作用域,引入了词法环境这一概念。我们可以简单地认为,var以及function声明的变量加入到环境变量,而let以及const声明的变量加入到词法环境当中。
我们可以通过一个函数的创建执行来分析这两种变量的不同。
function strong(){
var a = 1;
let b = 2;
{
var c = 3;
let d = 4;
console.log(c)
console.log(d)
}
console.log(a)
console.log(b)
console.log(c)
}
foo()
当函数创建并执行的时候,会产生如下的调用栈:
调用栈
当执行到console.log(c) 的时候,调用栈如下:
调用栈
可以看到 let , const 等块级作用域变量会直接放到词法环境中,首先在这里寻找变量,如果没有再去变量环境中寻找。块级代码执行完后,这些变量会被词法环境栈直接弹出。