【发布时间】:2012-05-27 12:38:50
【问题描述】:
我注意到我在标题中提到的属性在我的页面中显着增加(尤其是“(关闭)”)。
此操作系统和/或浏览器是否受控?我能做些什么吗?
究竟是什么(闭包)、(数组)、(编译代码)、(系统)等?
另外,(array) 和 'Array' 有什么区别?
【问题讨论】:
标签: javascript memory google-chrome-devtools
我注意到我在标题中提到的属性在我的页面中显着增加(尤其是“(关闭)”)。
此操作系统和/或浏览器是否受控?我能做些什么吗?
究竟是什么(闭包)、(数组)、(编译代码)、(系统)等?
另外,(array) 和 'Array' 有什么区别?
【问题讨论】:
标签: javascript memory google-chrome-devtools
关于你的问题:
问:究竟是什么(闭包),(数组),(编译代码),(系统)等?
an article by Addy Osmani 的这个 sn-p 可能会有所帮助:
(全局属性) – 全局对象(如“窗口”)与其引用的对象之间的中间对象。如果一个对象是使用构造函数 Person 创建的并且由一个全局对象持有,则保留路径看起来像 [global] > (global property) > Person。这与对象直接相互引用的规范形成对比。出于性能原因,我们有中间对象。全局对象会定期修改,属性访问优化对非全局对象做得很好,但不适用于全局对象。
(roots) – 保留树视图中的根条目是具有对选定对象的引用的实体。这些也可以是引擎为其自身目的创建的引用。引擎缓存了哪些引用对象,但所有这些引用都是弱引用,并且不会阻止对象被收集,因为没有真正的强引用。
(closure) – 通过函数闭包对一组对象的引用计数
(array, string, number, regexp) – 对象类型列表,其属性引用数组、字符串、数字或正则表达式
(已编译代码) – 简单地说,与已编译代码相关的所有内容。脚本类似于函数,但对应于主体。 SharedFunctionInfos (SFI) 是位于函数和编译代码之间的对象。函数通常有上下文,而 SFI 没有。
HTMLDivElement、HTMLAnchorElement、DocumentFragment 等 – 对代码引用的特定类型的元素或文档对象的引用。
整篇文章包含许多其他关于堆分析的有价值的信息:http://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools
还有你的另一个问题:
问:另外,(array)和'Array'有什么区别?
根据 Addy 的描述,我的解释是这样的:(array) 是具有引用实际数组的属性的对象(任何类型)的集合。相比之下,Array 是实际 Array 对象的列表。
【讨论】:
闭包是一个能够引用在其直接作用域之外声明的数据的函数。
这是一个例子:
var closure = (function() {
var a = "some data";
var b = "something else...";
return function Closure() {
// this function retains references to a and b.
}
})();
在 Web 开发中最常见的闭包方式是将事件侦听器附加到 dom 节点。
例如:
$.ready(function() {
var $elems = $("selector");
var tools = new Tools();
$elems.mousedown(function() { // <-- this has created a closure
// We can refer to $elems and tools in here
// and so as long as this function is held on to so are those variables to which
// it has access
});
});
如果您验证这一点,实际上会看到(关闭)计数上升
运行:
function DistinctName() {}
function DistinctName2() {}
在 JavaScript 控制台中
进行另一个堆转储
您会看到DistinctName 和DistinctName2 在(closure) 类别下显示为新的闭包。
v8 有一个“JIT”编译器,所以我假设(编译的)是指 JIT 编译的源代码。
我只能猜测(数组)和(系统)。
【讨论】:
$el.mousedown(function mousedownHandler() {}),然后它们应该在闭包列表中显示它们的名称。这将帮助您追踪正在发生的事情。堆转储比较视图对于查找新分配也非常有用。