JavaScript 中的执行上下文和对象

Execution context and object in JavaScript

JS中的对象、执行上下文有些东西我不明白。

当我们创建一个对象时,它会创建一个执行上下文吗?因为在调用函数时会创建执行上下文。如果不是,那么对象就像实际执行上下文中的其他变量一样?

谢谢。

When we create an object, does it create an execution context ?

没有

since an execution context is created when a function is invoked.

没错,但创建对象与调用函数不同。

And if it doesn't, so the object is just like the others variable in the actual execution context ?

该对象存在于内存中,并且对它的 引用 存在于任何变量中或 属性 您将其存储在其中。如果将其存储在变量中,则变量保存在一个词法环境对象中,与声明变量的执行上下文相关联。

一个具体的例子可能会有所帮助:

function foo() {
    var n = 42;
    var o = {};
    console.log(n, o.toString()); // 42, [object Object]
}
foo();

调用foo会创建一个执行上下文和一个与其关联的词法环境对象。 no 变量是存储在该词法环境中的 bindingsn 绑定的值是原始数字 42。o 绑定的值是对象的 reference。对象本身存在于内存中的其他地方。

+−−−−−−−−−−−−−−−−−−−−+
| Execution Context  |
+−−−−−−−−−−−−−−−−−−−−+   +−−−−−−−−−−−−−−−−−−−−−+
| Current Lex Env    |−−>| Lexical Environment |
| (some other stuff) |   +−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−+   | n: 42               |   +−−−−−−−−+
                         | o                   |−−>| Object |
                         | (some other stuff)  |   +−−−−−−−−+
                         +−−−−−−−−−−−−−−−−−−−−−+

但同样,上下文及其词法环境是通过调用 foo 而不是通过创建对象来创建的。

一旦 foo returns,如果在 foo 内没有创建闭包,则执行上下文及其关联的词法环境符合垃圾收集条件。

离你的问题有点远:如果我们在 foo 中创建了一个闭包,并且即使在 foo 返回后仍保留对它的引用,那么词法环境将被保留关闭; this question and its answers.

中有关闭包的更多信息