在Javascript

时间:2017-06-14 07:30:28

标签: javascript scope memory-address object-lifetime

这是一个荒谬的例子,纯粹用于说明目的:

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)fooObject {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) 调用的结果存储在堆栈的某个位置,直到第二个返回。是否可以在运行时直接引用此对象?

1 个答案:

答案 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()调用的结果存储在堆栈的某个位置,直到第二个返回。是否可以在运行时直接引用此对象?

不,你不能直接访问堆栈。