Skip to content

执行上下文

函数执行上下文:一个函数运行之前,创建的一块内存空间,空间中包含有该函数执行所需要的数据,为该函数执行提供支持。

执行上下文栈:call stack,所有执行上下文组成的内存空间。

栈:一种数据结构,先进后出,后进先出。

全局执行上下文:所有JS代码执行之前,都必须有该环境。

JS引擎始终执行的是栈顶的上下文。

执行上下文中的内容

  1. this指向

1). 直接调用函数,this指向全局对象 2). 在函数外,this指向全局对象 3). 通过对象调用或new一个函数,this指向调用的对象或新对象

  1. VO 变量对象

Variable Object:VO 中记录了该环境中所有声明的参数、变量和函数

Global Object: GO,全局执行上下文中的VO

Active Object:AO,当前正在执行的上下文中的VO

1). 确定所有形参值以及特殊变量arguments 2). 确定函数中通过var声明的变量,将它们的值设置为undefined,如果VO中已有该名称,则直接忽略。 3). 确定函数中通过字面量声明的函数,将它们的值设置为指向函数对象,如果VO中已存在该名称,则覆盖。

当一个上下文中的代码执行的时候,如果上下文中不存在某个属性,则会从之前的上下文寻找。

面试题

js
var foo = 1;
function bar() {
    console.log(foo);  //undefined
    if (!foo) {
        var foo = 10;
    }
    console.log(foo); //10
}

bar();
js
var a = 1;
function b() {
    console.log(a);  // fn
    a = 10;
    return;
    function a() { }
}
b();
console.log(a); //1
js
console.log(foo); //fn  C
var foo = "A";
console.log(foo)  //A
var foo = function () {
    console.log("B");
}
console.log(foo); //fn  B
foo(); // B
function foo(){
    console.log("C");
}
console.log(foo)  //fn B
foo(); // B
js
var foo = 1;


function bar(a) {
    var a1 = a;
    var a = foo;
    function a() {
        console.log(a); //1
    }
    a1();
}

bar(3);

MIT License