3

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

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

谢谢你。

4

1 回答 1

5

当我们创建一个对象时,它会创建一个执行上下文吗?

不。

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

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

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

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

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

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

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

+−−−−−−−−−−−−−−−−−−−−−−−+
| 执行上下文 |
+−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−+
| 当前 Lex 环境 |−−>| 词汇环境 |
| (一些其他的东西)| +−−−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−−−+ | n: 42 | +−−−−−−−−−+
                         | o |−−>| 对象 |
                         | (一些其他的东西)| +−−−−−−−−−+
                         +−−−−−−−−−−−−−−−−−−−−−−−+

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

一旦foo返回,如果在 中没有创建闭包foo,则执行上下文及其相关的词法环境有资格进行垃圾收集。

离你的问题有点远:如果我们在其中创建了一个闭包并在返回foo后保留了对它的引用,那么foo该闭包将保留词法环境;更多关于这个问题的闭包及其答案

于 2017-04-08T11:18:30.380 回答