(javascript)闭包关闭的封闭范围超过多少
Over how much of its enclosing scope does a (javascript) closure close?
当我有一些函数使用来自其封闭作用域的变量并在该作用域(这些作用域)之外使用该函数时,则称为闭包。
是否有关于超过"多少"的封闭范围(s)一个函数必须关闭的任何规范?(或者换句话说,它绝对不需要关闭的次数有多少?)
考虑:
function Outer() {
var bigGuy = createSomethingHuge();
var tinyNumber = 42;
return (function () { /* CONTENTS */ });
}
甚至:
function Layer1() {
var bigOne = somethingHugePlease();
var Layer2 = function() {
var bigToo = morePlease();
var Layer3 = function() {
var huge = reallyHuge();
var tiny = 42;
return (function () { /* CONTENTS */ });
};
return Layer3();
};
return Layer2();
}
最后返回的函数关闭这些变量中的哪个?它是否取决于最终函数的内容(eval
…?)?
我最感兴趣的是这些情况是否有某种规范,而不是一些特定实现的行为。
我最感兴趣的是这些情况是否有某种规范
ECMAScript规范并没有详细说明这一点。它简单地说,一个函数关闭了整个词法环境,其中包括所有父作用域中的所有变量,组织在所谓的环境记录中。
然而,它并没有指定一个实现应该如何进行垃圾收集——所以引擎必须自己优化它们的闭包——当它们可以推断出一些"闭包"变量永远不需要(引用)时,它们通常会这样做。特别是,如果您在闭包的任何地方使用eval
,它们当然不能这样做,并且必须保留所有内容。
不是关于某些特定实现的行为
无论如何,你都想看看JavaScript闭包是如何垃圾收集的,node.js的垃圾收集,关于闭包,LexicalEnvironment和GC以及JavaScript在运行时如何表示闭包和作用域
嵌套函数的作用域链包含对所有外部函数的激活对象的引用,这些外部函数的执行导致了嵌套函数的定义。当外部函数调用返回时,这些激活对象将所有值存储在适当的位置,并继续存在,因为它们位于作用域链中。
因此,根据定义,闭包捕获作用域中的所有变量值。eval("typeof bigGuy");
中的'function () {/* CONTENTS */}应该演示这一点。
ECMA标准可能*涵盖了这一点(如果你正在编写一个javascript引擎并且有时间)。一种解决方案可能是在不再需要它们的值时将大变量设置为undefined
。
*基于10年前ECMA 3.61的读数。计算机科学术语"闭包"没有出现在标准中。闭包的产生必须由读者推断出嵌套函数作用域链是如何构造的隐式结果——这是标准中的。作用域链包括当前执行函数的激活对象、外部函数的激活对象(按相反顺序),然后是全局对象。
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- 如何通过溢出来判断元素被切断了多少像素:隐藏在父级上
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- Jpgraph:如何手动设置X轴和Y轴的范围
- 在对象数组中查找多个值的d3范围
- 动态加载angularjs并生成控制器和范围
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在Materialize Calendar中设置年份范围
- 在MVVM视图模型中处理应用程序范围的元素
- setInterval游戏循环的范围问题
- AngularJS获取范围中的选定项目
- 从指定范围创建字符数组
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- angularjs范围内可以存储的最大数据大小是多少?具有重作用域的应用程序的性能
- (javascript)闭包关闭的封闭范围超过多少
- 在角函数中,范围变量的范围是多少