JS执行上下文

在执行JS代码时候,可以看成是在执行一个全局函数的代码,在这个全局函数的代码体中又有可能执行了很多个局部函数。

JS中在执行函数的时候会为函数创建一个执行的上下文用来保存在函数中创建的变量等数据,当函数执行完之后会销毁创建的该执行上下文。

这个执行上下文,不是一个对象,因为它只是在栈中开辟了一块内存,而在堆中并没有保存指向该栈地址的变量。

1.全局执行上下文

在执行JS代码前会首先将window确定为全局执行上下文,然后会对全局的数据做一些预处理:首先是var变量声明和函数声明的提升,然后将这些声明的变量添加为window的属性,函数添加为window的方法。this赋值为window。然后才开始执行JS的代码。

2.函数执行上下文

在调用函数的时候才会创建函数执行上下文。创建完成后,同样会先做一些预处理在开始执行函数体中的代码。这些预处理包括:如果函数又参数首先给函数的形参变量赋值,然后将该形参变量添加到创建的函数执行上下文的属性中;创建arguments变量,并赋值为传入的实参列表,然后将arguments添加为函数执行上下文的属性;var变量和函数的提升,并将其赋值到函数执行上下文的属性和方法;this赋值为调用该函数的对象。然后开始执行函数中的代码。

JS中使用栈来管理执行上下文的,栈的特性就是后进先出,在开始执行JS代码的时候首先将window全局执行上下文入栈,然后每调用函数的时候就创建该函数执行上下文并入栈,执行完函数中所有代码后将其出栈销毁。

原文地址:https://www.cnblogs.com/maycpou/p/12247928.html