JavaScript 中的执行上下文和对象
Execution context and object in JavaScript
JS中的对象、执行上下文有些东西我不明白。
当我们创建一个对象时,它会创建一个执行上下文吗?因为在调用函数时会创建执行上下文。如果不是,那么对象就像实际执行上下文中的其他变量一样?
谢谢。
When we create an object, does it create an execution context ?
没有
since an execution context is created when a function is invoked.
没错,但创建对象与调用函数不同。
And if it doesn't, so the object is just like the others variable in the actual execution context ?
该对象存在于内存中,并且对它的 引用 存在于任何变量中或 属性 您将其存储在其中。如果将其存储在变量中,则变量保存在一个词法环境对象中,与声明变量的执行上下文相关联。
一个具体的例子可能会有所帮助:
function foo() {
var n = 42;
var o = {};
console.log(n, o.toString()); // 42, [object Object]
}
foo();
调用foo
会创建一个执行上下文和一个与其关联的词法环境对象。 n
和 o
变量是存储在该词法环境中的 bindings。 n
绑定的值是原始数字 42。o
绑定的值是对象的 reference。对象本身存在于内存中的其他地方。
+−−−−−−−−−−−−−−−−−−−−+
| Execution Context |
+−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+
| Current Lex Env |−−>| Lexical Environment |
| (some other stuff) | +−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−+ | n: 42 | +−−−−−−−−+
| o |−−>| Object |
| (some other stuff) | +−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−−+
但同样,上下文及其词法环境是通过调用 foo
而不是通过创建对象来创建的。
一旦 foo
returns,如果在 foo
内没有创建闭包,则执行上下文及其关联的词法环境符合垃圾收集条件。
离你的问题有点远:如果我们在 foo
中创建了一个闭包,并且即使在 foo
返回后仍保留对它的引用,那么词法环境将被保留关闭; this question and its answers.
中有关闭包的更多信息
JS中的对象、执行上下文有些东西我不明白。
当我们创建一个对象时,它会创建一个执行上下文吗?因为在调用函数时会创建执行上下文。如果不是,那么对象就像实际执行上下文中的其他变量一样?
谢谢。
When we create an object, does it create an execution context ?
没有
since an execution context is created when a function is invoked.
没错,但创建对象与调用函数不同。
And if it doesn't, so the object is just like the others variable in the actual execution context ?
该对象存在于内存中,并且对它的 引用 存在于任何变量中或 属性 您将其存储在其中。如果将其存储在变量中,则变量保存在一个词法环境对象中,与声明变量的执行上下文相关联。
一个具体的例子可能会有所帮助:
function foo() {
var n = 42;
var o = {};
console.log(n, o.toString()); // 42, [object Object]
}
foo();
调用foo
会创建一个执行上下文和一个与其关联的词法环境对象。 n
和 o
变量是存储在该词法环境中的 bindings。 n
绑定的值是原始数字 42。o
绑定的值是对象的 reference。对象本身存在于内存中的其他地方。
+−−−−−−−−−−−−−−−−−−−−+ | Execution Context | +−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+ | Current Lex Env |−−>| Lexical Environment | | (some other stuff) | +−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−+ | n: 42 | +−−−−−−−−+ | o |−−>| Object | | (some other stuff) | +−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+
但同样,上下文及其词法环境是通过调用 foo
而不是通过创建对象来创建的。
一旦 foo
returns,如果在 foo
内没有创建闭包,则执行上下文及其关联的词法环境符合垃圾收集条件。
离你的问题有点远:如果我们在 foo
中创建了一个闭包,并且即使在 foo
返回后仍保留对它的引用,那么词法环境将被保留关闭; this question and its answers.