我不明白JS中的对象,执行上下文。
当我们创建一个对象时,它是否会创建一个执行上下文?因为在调用函数时会创建执行上下文。如果没有,那么对象就像实际执行上下文中的其他变量一样?
谢谢。
答案 0 :(得分:5)
当我们创建一个对象时,它是否创建了一个执行上下文?
没有
因为在调用函数时会创建执行上下文。
这是真的,但创建一个对象与调用一个函数不同。
如果没有,那么对象就像实际执行上下文中的其他变量一样?
对象存在于内存中,并且引用存在于您存储的任何变量或属性中。如果将其存储在变量中,该变量将保存在词法中环境对象与声明变量的执行上下文相关联。
一个具体的例子可能会有所帮助:
function foo() {
var n = 42;
var o = {};
console.log(n, o.toString()); // 42, [object Object]
}
foo();
调用foo
会创建一个执行上下文和一个与之关联的词法环境对象。 n
和o
变量是存储在该词汇环境中的绑定。 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中的闭包。