JavaScript中的执行上下文和对象
JS中的对象和执行上下文有些我不理解的地方 当我们创建一个对象时,它会创建一个执行上下文吗?因为执行上下文是在调用函数时创建的。如果没有,那么对象就和实际执行上下文中的其他变量一样了 多谢各位 当我们创建一个对象时,它会创建一个执行上下文吗 没有 因为执行上下文是在调用函数时创建的 没错,但创建对象与调用函数是不同的 如果没有,那么对象就和实际执行上下文中的其他变量一样了 对象存在于内存中,对它的引用存在于存储它的任何变量或属性中。如果将其存储在变量中,则该变量保存在与声明该变量的执行上下文相关联的词法环境对象中 一个具体的例子可能有助于:JavaScript中的执行上下文和对象,javascript,object,executioncontext,Javascript,Object,Executioncontext,JS中的对象和执行上下文有些我不理解的地方 当我们创建一个对象时,它会创建一个执行上下文吗?因为执行上下文是在调用函数时创建的。如果没有,那么对象就和实际执行上下文中的其他变量一样了 多谢各位 当我们创建一个对象时,它会创建一个执行上下文吗 没有 因为执行上下文是在调用函数时创建的 没错,但创建对象与调用函数是不同的 如果没有,那么对象就和实际执行上下文中的其他变量一样了 对象存在于内存中,对它的引用存在于存储它的任何变量或属性中。如果将其存储在变量中,则该变量保存在与声明该变量的执行上下文相关
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) | +−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−+
|执行上下文|
+−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+
|现行环境法|−−>| 词汇环境|
|(其他一些东西)|+−−−−−−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−+ | n:42 |+−−−−−−−−+
|o|−−>| 反对|
|(其他一些东西)|+−−−−−−−−+
+−−−−−−−−−−−−−−−−−−−−−+
但同样,上下文及其词汇环境是通过调用foo
创建的,而不是通过创建对象创建的
一旦foo
返回,如果在foo
中没有创建闭包,则执行上下文及其关联的词汇环境可以进行垃圾收集
你的问题有点离题了:如果我们在foo
中创建了一个闭包,并且在foo
返回后仍保留了对它的引用,那么该闭包将保留词汇环境;有关闭包的详细说明,请参见。(+1)