2017-02-09 229 views
1

每次我们执行函数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

未声明的变量是全球性的。 –

+0

@DenysSéguret'name'在'foo()'的第一行被声明。 – dshapiro

+3

js中的Google函数范围。例如:http://ryanmorr.com/understanding-scope-and-context-in-javascript/所以它基本上在退货时创建的闭包中。 – Shilly

回答

2

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

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

1

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

你没有办法告诉和(可能)没有理由关心。 JavaScript引擎为您管理内存。

它必须存储在一些对象内(如果我没有错的话)。

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

1)当然,它不是存储在对象外,否则它可以使用点符号访问。

编号JavaScript与作用域的属性分开管理作用域。

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

再次。 No.

变量的值存储在变量中。

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

您无法从JavaScript程序中检查内存分配,因此不提供API来执行此操作。