执行上下文的三个重要属性:
- 变量对象VO (变量;函数声明;函数的形参)
- 作用域链(JS采用词法作用域;其作用域在其定义时候就已经决定)
- this
在生成上下文的时候会有两个阶段
-
第一阶段(创建阶段):
- JS解释器会找出需要变量提升的变量以及函数,给他们开辟好内存空间
- 函数会整个存进去
- 变量只声明并且赋值为undefined
- 变量提升过程中;相同函数会覆盖上一个函数并且函数优先于变量提升
b() // call b
console.log(a) // undefined
var a = 'Hello world' //变量声明并赋值为unedfined
function b() { //创建VO时候偶函数整个保存
console.log('call b')
}
b() // call b second
function b() {
console.log('call b fist')
}
function b() { //变量提升;同样函数后面一个会覆盖前面一个
console.log('call b second')
}
var b = 'Hello world'
注意
let
不能在声明前使用;let并非是没有变量提升才不能在声明前使用;而是let提升了声明但是并没有赋值,其不能在声明前使用是因为临时死区