首先我们来说下,执行上下文简单来说就是js代码执行环境。总所周知,js是没有块级执行环境的【if/else】,只有函数体【function/object】执行环境。那就引出了全局变量和局部变量。那在js中,js引擎是怎样处理变量的呢·?函数体又如何?
关于变量
<script>
console.log(a);//报错【a is not defined】
//当注释上面一行代码后
console.log(b);//undefined
var b;
console.log(c);//undefined
var c = 10;
</script>
第一个a
报错,不用解释。但是为什莫后面b
和c
都是undefined
。这是因为对于变量而言,js并不是逐行解释,它存在着一个准备阶段,将上面的代码解析后是
<script>
console.log(a);
var b;
b = undefined;
console.log(b);
var c;
c = undefined;
console.log(c);
c = 10;
</script>
在同一层次的执行上下文中,js引擎会首先检索变量的定义,作为准备工作,在遇到赋值语句之前定义为undefined,这也就是为什莫说它打破了js逐条编译的特点。
关于函数体
<script>
console.log(fn1);//function fn1(){}
function fn1() {};//函数声明,直接声明一个函数
console.log(fn2);//undefined
var fn2 = function() {};//函数表达,利用一个变量表达函数
</script>
由结果可知:在准备阶段中,声明函数,则是直接赋值【因为此时赋值是声明的一部分】;函数表达式只是声明表达式变量。
所以总结可知:同一层次的执行上下文中,js引擎会会检索变量和函数体的声明,但并不对其做赋值操作object = value
。
关于执行上下文中的作用域,这里有,我就不多解释了。
菜鸟爬行中…