【问题标题】:How in-memory scoping takes place in javascript? [duplicate]在 javascript 中如何进行内存范围界定? [复制]
【发布时间】:2023-03-27 00:24:01
【问题描述】:

我知道词法作用域,但是作用域是如何在内存中发生的。

var val="a";

var func=function(data){
    this.data=data;
    console.log(val+" "+data); // val will be available because it is global.       
    var bar=function(innerData){
        console.log(innerData+" "+val+" "+data);
    }
    bar("inner");

}
func("outer");

但是作用域是如何在内存中定义的。

【问题讨论】:

  • 数据可能存储在堆上,如果这就是您的意思的话。
  • 当您说“作用域是如何在内存中发生的”时,您期望得到的答案是怎样的技术?
  • 查看@aug 发布的链接 - 我很确定这就是您要找的东西。
  • 我想知道内存范围是如何发生的内部机制,答案可以尽可能的技术性,谢谢

标签: javascript function scope in-memory


【解决方案1】:

每个被调用的函数都会在调用堆栈中创建一个激活记录,其中包含所有信息(包括该范围内可访问的变量的地址),并在内存中分配/保留所需的插槽。每当函数完成它正在做的任何事情时,激活记录都会从堆栈中弹出,并通过删除所有正在创建的局部变量来释放内存。

全局变量的问题是它们在任何特定范围或生命周期之外声明,因此只要其所在文件的程序或实例持续存在,它们就会持续存在,并且可以访问调用堆栈中的任何内容在那里,这样你就可以从你在 func 下声明的任何函数访问 val。

【讨论】:

  • 自 ES5 以来,activation record/object 一词不再存在。
  • 你确定内存被释放了吗??如果内存被释放,那么在关闭的情况下会发生什么?
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 2018-10-06
  • 1970-01-01
  • 2017-07-16
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多