这是一个荒谬的例子,纯粹用于说明目的:
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
在Object {bar: "baz"}
之前将function b
解析为匿名对象(function a
)吗?或者在foo
返回后b()
是否已解决?
2)由于临时缓存function a
调用的返回值以执行字符串连接,是否可以在运行时访问该匿名对象,就像我试过的那样?好吧,它显然不再被称为“foo”,但它暂时在function a() {
return b().bar + b().bar;
}
function b() {
var foo = {
bar: 'baz'
};
return foo;
}
console.log(a()); // logs "bazbaz".
的范围内,所以函数范围知道它的位置,对吗?
例如:
b()
这意味着第一个select *
from table1
where
((select max(rank) from table1 where usage = 'L') >= 25 and usage = 'H')
or ((select max(rank) from table1 where usage = 'L') < 25
and (select max(rank) from table1 where usage = 'M') >= 25
and usage = 'L')
or ((select max(rank) from table1 where usage = 'L') < 25
and (select max(rank) from table1 where usage = 'M') < 25)
调用的结果存储在堆栈的某个位置,直到第二个返回。是否可以在运行时直接引用此对象?
答案 0 :(得分:4)
1)在返回之前,
foo
是否在函数Object {bar: "baz"}
中被解析为匿名对象(b
)?或者在a
返回后在功能foo
中解决了吗?
标识符foo
仅存在于b
中。当您执行return foo
时,foo
的值将被解析,然后设置为b
的返回值(因此该值不再具有与标识符的任何连接)。
2)由于临时缓存
b()
调用的返回值以执行字符串连接,是否可以在运行时访问该匿名对象,就像我试过的那样?
不直接,您必须将该值存储在某处以便重复使用它:
function a() {
var bval = b();
return bval.bar + bval.bar;
}
这意味着第一个
b()
调用的结果存储在堆栈的某个位置,直到第二个返回。是否可以在运行时直接引用此对象?
不,你不能直接访问堆栈。