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.
       }
    }