变量存储在哪里?

时间:2017-02-09 14:55:57

标签: javascript function object

每次执行函数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();

2 个答案:

答案 0 :(得分:2)

JavaScript具有函数范围。这意味着,每个函数调用都有自己的一组变量。如果使用单词var在函数中声明变量,则此值唯一地存储在此函数实例中。如果您返回out有权访问此函数实例,则该变量不会被垃圾收集器清除并且仍然可用,而不是如果没有引用指向该变量。

您可以在JavaScript here on StackOverflow中找到有关范围的更多信息。

答案 1 :(得分:1)

  

我的问题是每个输出对象存储在内存中的变量名实际上是什么?

你无法分辨并且(可能)没有理由关心。 JavaScript引擎为您管理内存。

  

它必须存储在某个对象中(如果我没有错)。

JavaScript引擎甚至可能不是用OO语言编写的。

  

1)当然它没有存储在对象中,否则它可以使用点表示法访问。

没有。 JavaScript管理范围与对象的属性分开。

  

2)此外,它不存储在函数对象foo中。

再次。没有。

变量的值存储在变量中。

JavaScript引擎管理该变量在内存中的存储。

您无法从JavaScript程序内部检查内存分配,也没有提供API来执行此操作。