js执行环境的周边概念
一、熟悉几个名词:
1、执行环境(execution context),也叫执行上下文,每个函数都会有自己的执行环境;当浏览器首次加载脚本时,他将默认进入全局执行环境;如果接下来要调用一个内部函数,则创建一个新的执行环境,并将新建的执行环境压入执行环境栈(execution context stack)的顶部,在函数执行之后,栈将其环境弹出,控制权返回给之前的执行环境。
2、当代码在一个环境中执行时,每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。然后每进入一个执行环境,这个变量对象就被激活变成活动对象 (activation object),就可以被访问到了。当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链作用是保证对执行环境有权访问的所有变量和函数的有序访问。
3、执行环境的建立:
创建:创建作用域链,创建变量、函数、参数,求this的值;
执行:初始化变量的值和函数引用,执行代码。
4、变量对象初始化顺序:函数形参 --> 函数声明 --> 变量声明;(也是提升顺序)
① 函数声明过程中如果变量对象已经包含了相同名字的属性,则替换它的值;
② 变量声明过程中如果变量名和已经声明的函数名或者函数的参数名相同,则不会影响已经存在的属性。
二、看一个例子:
(function() { console.log(typeof a); // 'function' console.log(typeof b); // 'undefined' var a = 'a';
var b = function() { console.log('b') }; function a() { console.log('c') } }());
由于函数声明优先级高于变量声明,且参见上面②,所以a是function;
由于b是函数表达式,b相当于一个变量,只不过被赋值了一个函数,而变量在创建阶段被创建并被初始化为undefined,所以函数表达式不提升。