javascript上下文执行环境解析

javascript中的this总是指向当前执行代码的上下文,是调用当前可执行代码的对象的引用。

每一个函数都有自己的执行上下文执行环境,并且每个执行上下文中都有自己的变量对象 VO (Variable object) 用于存储当前执行上下文中的变量、函数声明、函数参数。

var a = 1;
function b() {
  console.log(a);   //undefined 
  var a = 2;
}
b();

为什么打印的值为undefined呢?

这是因为在函数 b 的内部 a 属于局部变量,在执行 console.log(a)的时候,a 还没有被生声明,所以此时的 a 无法找到其定义的值,所以为 undefined。

此时,当我们将 b() 中的 var a = 2 删除掉,再次去执行。

var a = 1;
function b() {
  console.log(a);   //1
}
b();

为什么打印的结果又是1了呢?

因为在执行 console.log(a) 的时候,没有局部变量 a ,所以javascript会逐级的向上去找,最终找到了全局变量 a 并且此时的值为1,所以最终的结果为 1。

再来看另外一种情况

var a = 1;
function a() {
  console.log(a) //报错 a is not a function
}
a();

这又是为什么呢?

原来啊,这里涉及到函数和变量的欲解析

函数声明会置顶

变量声明也会置顶

函数声明比变量声明更置顶

上面的代码可以看成如下

var a = function(){
  console.log(a);
}
var a = 1;
a();

这样就很容易看出问题了。

你可能感兴趣的:(javascript上下文执行环境解析)