Quo*_*ran 2 javascript object executioncontext
有一些关于JS中的对象,执行上下文,我不明白.
当我们创建一个对象时,它是否创建了一个执行上下文?因为在调用函数时会创建执行上下文.如果没有,那么对象就像实际执行上下文中的其他变量一样?
谢谢.
当我们创建一个对象时,它是否创建了一个执行上下文?
没有.
因为在调用函数时会创建执行上下文.
这是事实,但创建一个对象与调用一个函数是不同的.
如果没有,那么对象就像实际执行上下文中的其他变量一样?
该对象存在于内存中,对它的引用存在于您存储它的任何变量或属性中.如果将它存储在变量中,该变量将保存在与声明变量的执行上下文关联的词汇环境对象中.
具体示例可能有所帮助:
function foo() {
var n = 42;
var o = {};
console.log(n, o.toString()); // 42, [object Object]
}
foo();
Run Code Online (Sandbox Code Playgroud)
调用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返回之后也保留了对它的引用,那么该闭包将保留词汇环境; 更多关于这个问题及其答案的闭包.