全局函数执行过程

88 阅读1分钟
var name = 'zp';
console.log(num1);

var num1 = 20;
var num2 = 30
var result = num1 + num2;

foo(123) 

function foo(num) {
  console.log(m); 
  var m = 1;
  var n = 0;
  console.log('foo');
}

console.log(result);

1.代码被解析时,V8引擎内部会帮助我们创建一个对象(GlobalObject -> GO),注意变量的赋值是在执行代码后开始的,在解析阶段将声明的变量的保存在GO中,且初始都为undefined(这也就是变量作用域提升,也是为什么我们在变量声明前打印这个变量,值为undefined,而没有报错的原因),而对于函数来说,会在内存中开辟一块空间,然后将GO中的函数变量引用这个内存空间。

2.运行代码,V8为了执行代码,v8引擎内部会有一个执行上下文栈(Execution Context Stack, ECStack)(函数调用栈);对于全局代码是创建一个全局执行上下文,对于函数会创建函数执行上下文(注意,函数只有会被调用后,才会对该函数进行编译然后再执行)

补充: 变量在编译时就已经确定了作用域链,对于全局来说是GO,对于foo函数来说是自己的作用域VO + GO(parent scope父作用域),当我们使用的变量在自己的VO中找不到时就可以沿着作用域,一层层找,直到找到,如果找到了GO还没有找到的话,就会报错。

QQ截图20220704112002.png