写在前面:前段时间参加了金山的前端面试,面试过程当中常常get不到面试官的点,有时候即便理解了面试官的意思,却又不能准确的表达出来。让我意识到当前最大的问题是表达沟通能力不足。因此指望经过撰写学习文档的方式,来提高本身的表达和总结的能力。前端
执行上下文是指当前Javascript代码被解析和执行时所在环境的抽象概念,JavaScript 任何代码的运行都是在执行上下文中。面试
js代码运行在执行栈中,执行栈也叫作调用栈,具备后进先出的栈结构,用于存储js代码在执行过程当中建立的上下文环境。数组
<script>
baz();
foo();
function baz() {
console.log('in baz, we canot get bar: ', bar);
}
</script>
<script>
function foo() {
console.log('in foo, wen can get bar: ', bar);
}
foo();
var bar = 1;
baz();
</script>
复制代码
Uncaught ReferenceError: bar is not defined
。而后终止函数执行,将baz执行上下文移除。bar = undefined; foo: fun
bar = 1
赋值操做,而后执行函数baz。将建立baz执行上下文,由于只存在一个全局执行上下文,因此此时baz的外部环境对象的引用包括已经赋值的bar变量,因此会输出1。执行完毕,移除baz上下文。执行上下文分为两个阶段,建立阶段和执行阶段。bash
建立阶段主要完成三件事情。闭包
根据当前函数的执行环境来绑定函数的this值,好比做为对象属性调用,this的值将被绑定到对象实例上。函数
定义:词法环境是一种规范类型,基于 ECMAScript 代码的词法嵌套结构来定义标识符与特定变量和函数的关联关系。词法环境由环境记录(environment record)和可能为空引用(null)的外部词法环境组成。post
词法环境的组成 词法环境分为两个部分:环境记录;对外部环境的引用。学习
词法环境分为两种:
1)全局环境:在全局执行上下文中,是一个没有外部环境的词法环境。其外部引用为null。它拥有一个全局对象(window 对象)及其关联的方法和属性(例如数组方法)以及任何用户自定义的全局变量,this 的值指向这个全局对象。
2)函数环境:用户在函数中定义的变量被存储在环境记录中,其外部引用能够是函数环境也能够是全局环境。对于函数环境而言,还包含一个arguments对象,该对象包含函数参数的引用,是一个类数组结构,如this
function foo(a, b) {
var c = a + b;
}
foo(2, 3);
// arguments 对象
Arguments: {0: 2, 1: 3, length: 2}
复制代码
环境变量分为两种spa
变量环境也是词法法环境,用于存储var声明的变量。
执行上下文在建立阶段,会扫描并解析变量和函数声明。其中函数声明存储在环境中,而变量会被设置为 undefined(在 var 的状况下)或保持未初始化(在 let 和 const 的状况下)。这就是所谓的声明提高
在此阶段,完成对全部变量的分配,最后执行代码。若是找不到let变量的值,将会为其分配undefined。
理解函数执行上下文,可让咱们知道一段js代码按照什么样的顺序被执行和调用。有助于咱们理解声明提高,闭包,函数做用域,this绑定等等概念。归纳起来就是: