执行上下文与执行上下文栈
1. 变量提升与函数提升
说到执行上下文首先得说js中的变量提升与函数提升
变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 也就是说,在一个作用域中。首先先找到var定义的变量,先把变量作为上下文作用域对象的一个属性(但是是没有赋值),具体赋值需要根据代码执行情况进行赋值。 遇到函数定义语句的也会提升,也就是再函数定义前就可以使用函数。
变量提升:
console. log ( a) ;
var a = 3 ;
fn ( )
function fn ( ) {
console. log ( '我是函数fn' )
}
console. log ( f) ;
function f ( ) {
console. log ( '函数f' ) ;
}
var f = 3 ;
var c = 1
function c ( c) {
console. log ( c)
var c = 3
}
c ( 2 )
理解
执行上下文: 由js引擎自动创建的对象, 包含对应作用域中的所有变量属性 执行上下文栈: 用来管理产生的多个执行上下文 分类:
上下文的生命周期
全局 : 准备执行全局代码前产生, 当页面刷新/关闭页面时死亡 函数 : 调用函数时产生, 函数执行完时死亡(压栈与出栈) 包含哪些属性:
全局 :
用var定义的全局变量 ==>undefined 使用function声明的函数 ===>function this ===>window 函数
用var定义的局部变量 ==>undefined 使用function声明的函数 ===>function this ===> 调用函数的对象, 如果没有指定就是window 形参变量 ===>对应实参值 arguments ===>实参列表的伪数组 执行上下文创建和初始化的过程
全局:
在全局代码执行前最先创建一个全局执行上下文(window)(压栈) 收集一些全局变量, 并初始化 将这些变量设置为window的属性 函数:
在调用函数时, 在执行函数体之前先创建一个函数执行上下文(压栈) 收集一些局部变量, 并初始化 将这些变量设置为执行上下文的属性
console. log ( 'gb: ' + i)
var i = 1
foo ( 1 )
function foo ( i) {
if ( i == 4 ) {
return
}
console. log ( 'fb:' + i)
foo ( i + 1 )
console. log ( 'fe:' + i)
}
console. log ( 'ge: ' + i)