每次执行函数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();
答案 0 :(得分:2)
JavaScript具有函数范围。这意味着,每个函数调用都有自己的一组变量。如果使用单词var
在函数中声明变量,则此值唯一地存储在此函数实例中。如果您返回out
有权访问此函数实例,则该变量不会被垃圾收集器清除并且仍然可用,而不是如果没有引用指向该变量。
您可以在JavaScript here on StackOverflow中找到有关范围的更多信息。
答案 1 :(得分:1)
我的问题是每个输出对象存储在内存中的变量名实际上是什么?
你无法分辨并且(可能)没有理由关心。 JavaScript引擎为您管理内存。
它必须存储在某个对象中(如果我没有错)。
JavaScript引擎甚至可能不是用OO语言编写的。
1)当然它没有存储在对象中,否则它可以使用点表示法访问。
没有。 JavaScript管理范围与对象的属性分开。
2)此外,它不存储在函数对象foo中。
再次。没有。
变量的值存储在变量中。
JavaScript引擎管理该变量在内存中的存储。
您无法从JavaScript程序内部检查内存分配,也没有提供API来执行此操作。