每次我们执行函数foo()
时,我们都会创建一个新对象out
,该对象正在返回。每个这样的out
对象都有两个属性getName和setName,都是函数。这些功能记住了它们的定义范围,因此这些功能始终能够访问自己的变量副本name
。变量存储在哪里?
我的问题是实际上存储在内存中的变量name
对于每个out
对象?它必须存储在某个对象内(如果我没有错的话)。
1)当然,它不存储在对象out
中,否则它将可以使用点符号访问。
2)另外,它不存储在函数对象foo
中。如果是x.setName("JavaScript")
会影响y.getName()
的价值,但事实并非如此。
function foo(){
var name="";
out = {
getName: function(){return name;},
setName: function(newName){name = newName}
};
return out;};
var x = foo();
var y = foo();
未声明的变量是全球性的。 –
@DenysSéguret'name'在'foo()'的第一行被声明。 – dshapiro
js中的Google函数范围。例如:http://ryanmorr.com/understanding-scope-and-context-in-javascript/所以它基本上在退货时创建的闭包中。 – Shilly