JavaScript中的执行上下文和对象

Quo*_*ran 2 javascript object executioncontext

有一些关于JS中的对象,执行上下文,我不明白.

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

谢谢.

T.J*_*der 5

当我们创建一个对象时,它是否创建了一个执行上下文?

没有.

因为在调用函数时会创建执行上下文.

这是事实,但创建一个对象与调用一个函数是不同的.

如果没有,那么对象就像实际执行上下文中的其他变量一样?

该对象存在于内存中,对它的引用存在于您存储它的任何变量或属性中.如果将它存储在变量中,该变量将保存在与声明变量的执行上下文关联的词汇环境对象中.

具体示例可能有所帮助:

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

调用foo创建执行上下文和与之关联的词法环境对象.在no变量绑定存储在词法环境.该n结合的值是原始数42. o绑定的值是一个参考的对象.对象本身存在于内存的其他地方.

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

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

一旦foo退货,如果没有被封内创建foo,执行上下文及其关联词法环境有资格进行垃圾回收.

远离你的问题:如果我们在内部创建了一个闭包foo并且即使在foo返回之后也保留了对它的引用,那么该闭包将保留词汇环境; 更多关于这个问题及其答案的闭包.