调用栈、执行上下文、变量环境以及词法环境

我心飞翔 分类:javascript

文章参考:

time.geekbang.org/column/arti…
github.com/mqyqingfeng…

执行上下文

**定义:**当 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 等块级作用域变量会直接放到词法环境中,首先在这里寻找变量,如果没有再去变量环境中寻找。块级代码执行完后,这些变量会被词法环境栈直接弹出。

回复

我来回复
  • 暂无回复内容