JavaScript中的执行上下文

JavaScript中的执行上下文,javascript,executioncontext,Javascript,Executioncontext,在JavaScript中为每个函数创建一个新的执行上下文 运行以下代码时,内存中存在多少执行上下文?请注意,未调用函数Bar function Foo () { function Bar() {} } Foo(); 此外,何时创建执行上下文?在计算时或运行时?创建函数时,它们在运行时编译。该函数在您调用它们时被调用 让我解释一下: 您可以有任意数量的函数上下文,每个函数调用都会创建一个新上下文 //Global Context var helloWorld = "hello worl

在JavaScript中为每个函数创建一个新的执行上下文

运行以下代码时,内存中存在多少执行上下文?请注意,未调用函数
Bar

function Foo () {

  function Bar() {}

}

Foo();

此外,何时创建执行上下文?在计算时或运行时?

创建函数时,它们在运行时编译。该函数在您调用它们时被调用

让我解释一下:

您可以有任意数量的函数上下文,每个函数调用都会创建一个新上下文

//Global Context
var helloWorld = "hello world!";
function foo(){//execution context
  function bar(){//execution context
   console.log('bar');
  }
}
foo();
因此,在上面的代码中,正在调用函数foo,并为函数foo创建新上下文,而bar的执行上下文仅在调用它之后创建,但它已经在运行时编译

当浏览器首次加载脚本时,默认情况下,它将进入全局执行上下文。如果在全局范围内调用函数,程序的序列流将进入被调用的函数,创建新的执行上下文并将该上下文推到执行堆栈的顶部

现在让我们详细了解一下执行上下文:

因此,每次调用函数时,都会创建一个新的执行上下文。对执行上下文的每个调用都有两个阶段:

1。创作阶段:

当函数被调用但在它执行内部任何代码之前,是:创建作用域链,创建变量、函数和参数,并确定“this”的值

2。激活阶段:

为函数赋值、引用并执行代码


:

foo()调用中的ExecutionContext:步骤1:创建参数

ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2, callee: function() //Points to foo function
    }
}
步骤3a:变量实例化、参数

ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2, callee: function() //Points to foo function
    },
    a: ‘foo’, b: ‘bar’, c: undefined
}
步骤3b:变量实例化,函数

ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2, callee: function() //Points to foo function 
    },
    a: ‘foo’, b: ‘bar’, c: undefined,
    z: function() //Created z() function
}
步骤3c:变量实例化,变量

ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2, callee: function() //Points to foo function
    },
    a: ‘foo’, b: ‘bar’, c: undefined,
    z: function(), //Created z() function,
    d: undefined
}
步骤4:设置此值

ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2,  callee: function() //Points to foo function
    },
    a: ‘foo’, b: ‘bar’, c: undefined,
    z: function(), //Created z() function,
    d: undefined,
    this: window
}

创建ExecutionContext后,函数从第一行开始运行其代码,直到找到返回或函数结束。每次此代码尝试访问变量时,都会从ExecutionContext对象读取该变量。

函数的运行时调用是创建执行上下文的原因。因此,在您的示例中,只有一个函数调用,因此只涉及一个执行上下文

函数的静态(编译时)安排很重要,因为这决定了执行上下文的范围和最终内容。然而,对于上下文的创建来说,对函数的实际调用很重要。(一些较旧的语言使用了术语“激活记录”,尽管这可能更适用于基于堆栈的分配。)

你可以用有时夸张的语言阅读细节,尽管很难分辨出森林是什么。该规范是根据正在转移的控制编写的。函数调用是一种非常常见的方式,但调用事件处理程序,或在浏览器最初加载时调用完整的
块也是如此

调用
Foo()时

  • 由于调用单个
    函数
  • 在此过程中,还会创建一个指向函数
    的指针

此外,还有一个默认环境,您的代码第一次在该环境中执行,称为全局上下文

我的最佳猜测是,它可能取决于您运行代码的环境

尽管检查V8并不困难,但它不会为根本未执行的函数创建执行上下文


你的答案是什么(甚至是猜测)?这看起来像是一个测验题。这个问题是直接从我的大脑里提出来的。它看起来像是一个测验题吗?没有更多的上下文,它读起来像是家庭作业上的东西,但足够公平;如果你说不是,那就不是我33岁了。我好久没做作业了。谢谢你莫名其妙的否决票?!我相信还有一个全球执行环境。在评估javascript文件时输入的一个。毕竟,必须有一些执行上下文来评估Foo的定义。@Jazzepi是的,这是真的;我个人认为这本质上是一个特例;它在很多重要方面都类似于函数调用,但并不完全相同。好的,下面将创建两个执行上下文:
function Foo(){this.bar=(function(){}())};新Foo()
delete
ing属性
bar
是否会删除相应的执行上下文?创建函数不会导致它“停留在堆栈中”。@JasonS这是我键入时的错误,现在已更正。
ExecutionContext: {
    arguments: {
        0: ‘foo’, 1: ‘bar’,
        length: 2,  callee: function() //Points to foo function
    },
    a: ‘foo’, b: ‘bar’, c: undefined,
    z: function(), //Created z() function,
    d: undefined,
    this: window
}