在 Javascript 中缓存匿名对象
Caching of anonymous objects in Javascript
这是一个纯粹用于说明目的的荒谬示例:
function a() {
return b().bar + foo.bar;
}
function b() {
var foo = {
bar: 'baz'
};
return foo;
}
console.log(a()); // Obviously throws a Uncaught ReferenceError: foo is not defined.
我想了解的是:
1) foo
是否在 returning 之前在 function b
中解析为匿名对象 (Object {bar: "baz"}
)?还是在 foo
被 returned 之后在 function a
中解决了?
2) 由于 b()
调用的 return 值被临时缓存以执行字符串连接,是否有可能在 运行 时间内访问该匿名对象,就像我试过的那样?好吧,它显然不再被称为 "foo",但它暂时在 function a
的范围内,所以函数范围知道它的位置,对吗?
例如:
function a() {
return b().bar + b().bar;
}
function b() {
var foo = {
bar: 'baz'
};
return foo;
}
console.log(a()); // logs "bazbaz".
这意味着第一个 b()
调用的结果存储在堆栈中的某个位置,直到第二个 returns。 运行时间可以直接引用这个对象吗?
1) Is foo
resolved as an anonymous object (Object {bar: "baz"}
) in function b
before returning? Or is it resolved in function a
after foo
is returned?
标识符 foo
仅存在于 b
中。当您执行 return foo
时,foo
的值被解析,然后设置为 b
的 return 值(此后该值不再与标识符有任何联系) .
2) Since the return value of the b()
call is cached temporarily in order to execute the string concatenation, would it be possible to access that anonymous object during run time, like I tried?
不是直接的,您必须将该值存储在某个地方才能重用它:
function a() {
var bval = b();
return bval.bar + bval.bar;
}
Which means the result of the first b()
call is stored somewhere on the stack until the second one returns. Is it possible to refer to this object directly during run-time?
不,你不能直接访问堆栈。
这是一个纯粹用于说明目的的荒谬示例:
function a() {
return b().bar + foo.bar;
}
function b() {
var foo = {
bar: 'baz'
};
return foo;
}
console.log(a()); // Obviously throws a Uncaught ReferenceError: foo is not defined.
我想了解的是:
1) foo
是否在 returning 之前在 function b
中解析为匿名对象 (Object {bar: "baz"}
)?还是在 foo
被 returned 之后在 function a
中解决了?
2) 由于 b()
调用的 return 值被临时缓存以执行字符串连接,是否有可能在 运行 时间内访问该匿名对象,就像我试过的那样?好吧,它显然不再被称为 "foo",但它暂时在 function a
的范围内,所以函数范围知道它的位置,对吗?
例如:
function a() {
return b().bar + b().bar;
}
function b() {
var foo = {
bar: 'baz'
};
return foo;
}
console.log(a()); // logs "bazbaz".
这意味着第一个 b()
调用的结果存储在堆栈中的某个位置,直到第二个 returns。 运行时间可以直接引用这个对象吗?
1) Is
foo
resolved as an anonymous object (Object {bar: "baz"}
) in functionb
before returning? Or is it resolved in functiona
afterfoo
is returned?
标识符 foo
仅存在于 b
中。当您执行 return foo
时,foo
的值被解析,然后设置为 b
的 return 值(此后该值不再与标识符有任何联系) .
2) Since the return value of the
b()
call is cached temporarily in order to execute the string concatenation, would it be possible to access that anonymous object during run time, like I tried?
不是直接的,您必须将该值存储在某个地方才能重用它:
function a() {
var bval = b();
return bval.bar + bval.bar;
}
Which means the result of the first
b()
call is stored somewhere on the stack until the second one returns. Is it possible to refer to this object directly during run-time?
不,你不能直接访问堆栈。