Javascript中匿名对象的缓存

Javascript中匿名对象的缓存,javascript,scope,memory-address,object-lifetime,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) 返回之前,foo是否在函数b中解析为匿名

这是一个毫无意义的例子,仅用于说明目的:

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
是否在
函数b
中解析为匿名对象(
对象{bar:“baz”}
)?还是在返回
foo
后在
函数a
中解析

2) 由于
b()
调用的返回值是临时缓存的,以便执行字符串连接,因此是否可以像我尝试的那样在运行时访问该匿名对象?很明显,它不再被称为“foo”,但它暂时在
函数a
的范围内,所以函数范围知道它的位置,对吗

例如:

function a() {
  return b().bar + b().bar;
}

function b() {
  var foo = {
    bar: 'baz'
  };
  return foo;
}

console.log(a()); // logs "bazbaz".
这意味着第一个
b()
调用的结果存储在堆栈的某个位置,直到第二个调用返回。是否可以在运行时直接引用此对象

1) 返回前,
foo
是否在函数
b
中解析为匿名对象(
object{bar:“baz”}
)?还是在返回
foo
后在函数
a
中解析

标识符
foo
仅存在于
b
中。当您执行
返回foo
时,
foo
的值被解析,然后设置为
b
的返回值(因此该值不再与标识符有任何连接)

2) 由于
b()
调用的返回值是临时缓存的,以便执行字符串连接,因此是否可以像我尝试的那样在运行时访问该匿名对象

不是直接的,您必须将该值存储在某个地方才能重用它:

function a() {
  var bval = b();
  return bval.bar + bval.bar;
}
这意味着第一个
b()
调用的结果存储在堆栈的某个位置,直到第二个调用返回。是否可以在运行时直接引用此对象

不,您不能直接访问堆栈

1) 返回前,
foo
是否在函数
b
中解析为匿名对象(
object{bar:“baz”}
)?还是在返回
foo
后在函数
a
中解析

标识符
foo
仅存在于
b
中。当您执行
返回foo
时,
foo
的值被解析,然后设置为
b
的返回值(因此该值不再与标识符有任何连接)

2) 由于
b()
调用的返回值是临时缓存的,以便执行字符串连接,因此是否可以像我尝试的那样在运行时访问该匿名对象

不是直接的,您必须将该值存储在某个地方才能重用它:

function a() {
  var bval = b();
  return bval.bar + bval.bar;
}
这意味着第一个
b()
调用的结果存储在堆栈的某个位置,直到第二个调用返回。是否可以在运行时直接引用此对象


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

名称foo仅存在于
函数b
的范围内。该名称在该函数之外毫无意义。所有对象在JavaScript中都是“匿名”的。对象没有名称的一般概念。是否可以在运行时直接引用此对象<代码>变量foo2=b()据我所知,它将指向与在
b
函数中创建的对象相同的对象,对象在JS中是通过引用传递的。@乔治:注意这里,“通过引用传递”是一个艺术术语,专门指将变量的引用传递到函数中。JavaScript根本没有通过引用传递。传入和传出与对象相关的函数的值称为对象引用,但“引用”一词的用法完全不同。@George:不同的功能。请参阅,这是针对Java的,但JavaScript在这方面是相同的。foo这个名称只存在于
函数b
的范围内。该名称在该函数之外毫无意义。所有对象在JavaScript中都是“匿名”的。对象没有名称的一般概念。是否可以在运行时直接引用此对象<代码>变量foo2=b()据我所知,它将指向与在
b
函数中创建的对象相同的对象,对象在JS中是通过引用传递的。@乔治:注意这里,“通过引用传递”是一个艺术术语,专门指将变量的引用传递到函数中。JavaScript根本没有通过引用传递。传入和传出与对象相关的函数的值称为对象引用,但“引用”一词的用法完全不同。@George:不同的功能。请参阅,这是针对Java的,但JavaScript在这方面是相同的。