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在这方面是相同的。