js 变量提升与函数提升
//Q: var c = 1 function c(c){ console.log(c) var c = 3 } c(2) //A: 报错 //Ex: //1. 解释阶段(预处理) var c function c(c){ console.log(c) var c = 3 } //2. 执行阶段 c=1 c(2) //c is not a function
提升发生在脚本的解释阶段,提升时,先提升变量,再提升函数。剥离了提升的内容后,剩余的代码按顺序执行。
提升后的变量和函数放到相应的上下文栈( LIFO )中。
上下文分为三类:
1. 全局执行上下文,浏览器中为windows,nodejs中为global
对以下全局内进行预处理:
① 通过 var 声明的变量(代码尚未执行,不进行赋值操作,故而为undefined)
② 函数声明
③ 将window的地址赋值给this
前两项会添加到全局对象中,成为执行上下文
2. 函数执行上下文
当调用函数时,在函数执行前,对以下内容进行预处理:
① 形参赋值
② arguments赋值
③ var提升(代码尚未执行,不进行赋值操作,故而为undefined)
④ 内部声明的函数的提升
⑤ 将调用函数的对象的地址赋值给this
其中前四项会添加到函数执行上下文中
3. eval上下文
注: 执行上下文的创建阶段主要负责三件事:确定this---创建词法环境组件(LexicalEnvironment)---创建变量环境组件(VariableEnvironment)
另可参考:
上下文区别于作用域:
作用域是静态的,在写代码是就已确定,而上下文随着函数的执行与结束而在上下文栈中创建与销毁。