Javascript 存储模块内存拷贝
Javascript 存储模块内存拷贝,javascript,Javascript,myClass的每个实例都有自己的bar和foo副本,这就是原型方法使用更少内存的原因。然而,我想知道更多关于内存使用内部方法的信息
显然,我认为下面的(1)一定是真的。你同意吗
不同的myClass实例不仅有自己的bar的不同副本,而且还必须有自己的myClass附件的不同副本。(或者bar方法如何在每个实例的基础上保持myClass变量的直线性?)
现在(2)是我真正想问的问题
由于内部foo方法不使用myClass附件中的任何内容,因此一个自然的问题是:javascript是否足够聪明,不
myClass的每个实例都有自己的bar和foo副本,这就是原型方法使用更少内存的原因。然而,我想知道更多关于内存使用内部方法的信息
显然,我认为下面的(1)一定是真的。你同意吗
不同的myClass实例不仅有自己的bar的不同副本,而且还必须有自己的myClass附件的不同副本。(或者bar方法如何在每个实例的基础上保持myClass变量的直线性?)
现在(2)是我真正想问的问题
由于内部foo方法不使用myClass附件中的任何内容,因此一个自然的问题是:javascript是否足够聪明,不在内存中保留myClass附件以供foo使用李>
我相当肯定,任何函数都有指向整个状态的指针。它是否引用任何变量都无关紧要,因为它仍然可以访问这些变量
当然,您确实释放了bar和foo,它们都指向对象的相同“整个状态”。所以它不需要更多的内存。我猜您必须在内部分配一个以上的指针,以便您可以指向对象的“整个状态”,但优化类似的内容是愚蠢的
它是否对其进行优化取决于javascript引擎。务必阅读铬源并找出原因
我看看能不能帮你从规范中找出一些引语
从规范中输入功能代码:
10.4.3输入功能代码时,执行以下步骤:
控件进入执行上下文
对于包含在中的函数代码
函数对象F,提供的调用方
此参数,并提供了一个调用方
论点列表:
如果函数代码是严格代码,请将ThisBinding设置为thisArg李>
否则,如果thisArg为null或未定义,请将ThisBinding设置为
全局对象李>
否则,如果类型(thisArg)不是对象,请将ThisBinding设置为
ToObject(thisArg)李>
否则将ThisBinding设置为thisArg李>
让localEnv作为调用NewDeclarativeEnvironment的结果
传递[[Scope]]的值
F的内部性质
争论李>
将LexicalEnvironment设置为localEnv李>
将VariableEnvironment设置为localEnv
跟踪您的环境到NewDeclarativeEnvironment
NewDeclarativeEnvironment
10.2.2.2抽象操作时的NewDeclarativeEnvironment(E)
调用NewDeclarativeEnvironment
使用词汇环境或
在以下步骤中,参数E为null
执行以下操作:
让env成为一个新的词汇环境李>
让envRec成为一个新的声明性环境记录,其中不包含
绑定李>
将env的环境记录设置为envRec李>
将env的外部词汇环境引用设置为E
返回环境
这会将您的环境跟踪到E,E是函数对象的[[Scope]]]
13.2在指定可选参数列表的情况下创建函数对象
根据FormalParameterList,一个主体
由FunctionBody指定,一个词法
范围指定的环境,以及
布尔标志Strict,一个函数对象
其结构如下:
创建一个新的本机ECMAScript对象,并让F成为该对象李>
如前所述,设置F的所有内部方法,除了[[Get]]
在8.12李>
将F的[[Class]]内部属性设置为“Function”李>
将F的[[Prototype]]内部属性设置为标准内置属性
指定的函数原型对象
在15.3.3.1中李>
如15.3.5.4所述,设置F的[[Get]]内部属性李>
如13.2.1所述,设置F的[[Call]]内部属性李>
如13.2.2所述,设置F的[[Construct]]内部属性李>
如中所述,设置F的[[HasInstance]]内部属性
15.3.5.3. 李>
将F的[[Scope]]内部属性设置为Scope的值李>
让名称是一个列表,包含从左到右的文本或
事实证明,规范只是告诉你你已经知道的事情。每个函数都包含作用域。正如另一张海报所提到的,要在内存管理方面“优化”一些范围,这取决于单个实现
如果你问我,你真的不在乎这个,除非你有超过百万个这样的对象实例
规范中的以下块更适用:
外部环境参考是
用于为的逻辑嵌套建模
词汇环境值。外层
(内部)词汇的引用
环境是指
符合逻辑的词汇环境
围绕内在词汇
环境外部词汇
当然,环境也有其自身的原因
自己的外部词汇环境。A.
词汇环境可以作为学习的基础
多个内部系统的外部环境
词汇环境。例如,如果
函数声明包含两个
嵌套的函数声明,然后
每种语言的词汇环境
嵌套函数将具有
外部词汇环境
当前执行的环境
周围的功能
这两个嵌套函数都对外部词法环境有相同的引用,这将完全取决于实现,而不是语言。幼稚的实现将比其他实现保持更多。任何适用于V8(chrome的JS引擎)的答案都可能不适用于Spidermonkey(Firefox)或JScript(IE)等
根据我的经验(这肯定是GHC处理闭包的方式),函数的实际代码(内部或外部)只存在一次,但是必须为闭包保留将变量映射到值的“环境”(bar),所以不,我不希望JS实现保持不变
function myClass()
{
//lots and lots of vars and code here.
this.bar = function()
{
//do something with the numerous enclosed myClass vars
}
this.foo = function()
{
alert('Hello'); //don't do anything with the enclosed variables.
}
}