JavaScript中的执行上下文和对象

时间:2017-04-08 11:10:30

标签: javascript object executioncontext

我不明白JS中的对象,执行上下文。

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

谢谢。

1 个答案:

答案 0 :(得分:5)

  

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

没有

  

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

这是真的,但创建一个对象与调用一个函数不同。

  

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

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

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

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

调用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返回后也保留了对它的引用,那么该闭包将保留词汇环境;更多关于this question and its answers中的闭包。