数码资讯
Javascript内存管理简介
简介 低层次的语言,如C,有较低的内存管理算法,想malloc()、自由()。另一方面,Javascript的内存基本分配当变量(对象,字符串,等等),然后创建自动释放时,他们不再使用。后者称为自动垃圾收集。这是开发商的Javascript混淆和妄想(和其他高级语言):他们可以不考虑内存管理。 记忆
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
简介
低层次的语言,如C,有较低的内存管理算法,想malloc()、自由()。另一方面,Javascript的内存基本分配当变量(对象,字符串,等等),然后创建自动释放时,他们不再使用。后者称为自动垃圾收集。这是开发商的Javascript混淆和妄想(和其他高级语言):他们可以不考虑内存管理。
记忆的生命周期
无论什么程序语言,内存生命周期基本相同:
1。分配你需要的内存
2。使用它(读,写)
三.不用时,释放PS:把大象放在冰箱里。
这个过程的前两部分在所有语言中都是清楚的,最后一步在低级语言中是清楚的,但是在高级语言中,比如Javascript,最后一步是不清楚的。
javascript的内存分配
变量的初始化
为了不让程序员担心分发,Javascript在定义变量时完成了内存分配。
复制代码代码如下所示:
var = 123;对数字变量的内存分配
var s =AZERTY; / /字符
var { { { {
甲:1,
B:空
作为对象并包含};变量内存分配
var a = { 1,null,阿布拉}; / /包括变量为数组分配内存(对象)
函数f(a){
返回一个+ 2;
} / /功能(可以调用)的内存分配
函数表达式也可以赋值对象。
SomeElement.addEventListener(听到咔哒声,函数(){(){
someelement.style.backgroundcolor = '蓝色';
},假);
通过函数调用来分配内存
一些函数调用结果被分配对象内存:
复制代码代码如下所示:
新日期();
var = document.createelement('div '); / /分配一个DOM元素
有些方法分配新变量或新对象:
复制代码代码如下所示:
var s =AZERTY;
VaR S2 = s.substr(0, 3); / / S2是一个新的字符串
因为字符串是不变的,Javascript不分配内存,但只有0-3的存储范围。
var a = {ouais ouais
生成
a.concat VaR A3(A2); / / =新的阵列连接四个元素的数组,数组中的A2。
使用价值
使用值的过程实际上是读写分配内存的操作,这意味着我们可以编写变量或对象的属性值,甚至可以传递函数的参数。
不再需要使用时释放内存
大多数内存管理问题都在这个阶段。这里最困难的任务是找出分配的内存不再需要。它通常需要开发人员确定程序中不再需要的内存块并释放它。
高级语言解释器嵌入在垃圾收集器中。主要的任务是跟踪内存的分配和使用,这样当它不再使用时,它会自动释放分配的内存,这个过程是近似的,因为不可能确定一块内存是否需要确定(不能用某种算法来解决)。
垃圾收集
如上所述,不可能查明是否不再需要某些内存。因此,垃圾收集的实现只能局限于解决一般问题。
引用
垃圾收集算法主要依赖于参考的概念。在内存管理的环境中,如果一个对象可以访问另一个对象(隐式或显式),它被称为一个对象引用另一个对象。例如,一个Javascript对象参考其原型(暗示)和一个参考它的性质(显式引用)。
在这种情况下,对象的概念不仅是一个特殊的Javascript对象,而且是一个函数域(或全局词法范围)。
引用计数垃圾收集
这是最简单的垃圾收集算法,该算法不需要简化对象作为对象的定义或其他对象是否被引用,如果没有引用对象(零引用),则对象将被垃圾回收机制回收。
例如
复制代码代码如下所示:
var { { { {
{:
B:2
}
};
这两个对象被创建,另一个属性被引用,另一个被赋值给变量O。
显然,没有人可以被垃圾收集。
第二个变量是对这个对象的引用。
o = 1;现在,这个对象的原始引用O被O2替换
var是指对象的属性。
现在,这个对象有两个引用,一个是O2,一个是OA。
第一个对象现在是零引用。
他可以收集垃圾。
但是,它的对象的属性是对OA的引用,因此无法恢复。
一个对象属性现在是零引用。
它可以是垃圾回收
限制:循环引用
这种简单算法的局限性在于,如果一个对象引用另一个对象,则可能不需要它,但它们将不被恢复。
复制代码代码如下所示:
函数f(){
var;
var;
O = O2;O/O参考氧
O2 = O;O O / O2参考O
返回AZERTY;
}
(f);
这两个对象被创建,互相引用,形成一个圆。
他们在通话结束后没有离开功能范围。
所以它们不再使用,可以循环使用。
但是,考虑每个引用计数算法至少被引用一次,因此它们不会被循环使用。
现实的一个例子
IE 6, 7回收DOM对象的引用计数,对他们来说一个常见的问题是内存泄漏:
复制代码代码如下所示:
var div = document.createelement(div);
div.onclick =函数(){
DoSomething();
};
/ / DIV与参考属性onclick事件处理程序
事件处理也有一个对div的引用,可以在函数域中访问
这将导致一个循环引用,即不收集两个对象。
标记清除算法
该算法不需要简化对象的定义,就可以获得对象。
该算法假定一个对象称为根集(在Javascript中,根是一个全局对象)。定期对垃圾收集器将从根源入手,找到所有的物品,从根引用,并找到对象引用的对象…从根,垃圾收集器会发现所有的物体,可以得到所有的对象不可用。
该算法比以前的算法要好,因为零引用对象总是不可用,但相反,它不一定是循环引用。
自2012以来,所有的现代浏览器都使用标记-清除垃圾收集算法,改进了Javascript的垃圾收集算法是基于标记清除算法的改进,它不提高标记清除算法本身及其简化定义对象是否已不再需要。
循环引用不再是问题。
在上面的示例中,在返回函数调用后,不能从全局对象获得两个对象,因此,它们将由垃圾回收器回收。
在第二个示例中,一旦无法从根中获得div及其事件处理,它们将由垃圾回收器回收。
限制:对象需要显式地不可用。
虽然这是一个限制,但它很少被打破,这就是为什么现实中很少有人关心垃圾收集机制的原因。
低层次的语言,如C,有较低的内存管理算法,想malloc()、自由()。另一方面,Javascript的内存基本分配当变量(对象,字符串,等等),然后创建自动释放时,他们不再使用。后者称为自动垃圾收集。这是开发商的Javascript混淆和妄想(和其他高级语言):他们可以不考虑内存管理。
记忆的生命周期
无论什么程序语言,内存生命周期基本相同:
1。分配你需要的内存
2。使用它(读,写)
三.不用时,释放PS:把大象放在冰箱里。
这个过程的前两部分在所有语言中都是清楚的,最后一步在低级语言中是清楚的,但是在高级语言中,比如Javascript,最后一步是不清楚的。
javascript的内存分配
变量的初始化
为了不让程序员担心分发,Javascript在定义变量时完成了内存分配。
复制代码代码如下所示:
var = 123;对数字变量的内存分配
var s =AZERTY; / /字符
var { { { {
甲:1,
B:空
作为对象并包含};变量内存分配
var a = { 1,null,阿布拉}; / /包括变量为数组分配内存(对象)
函数f(a){
返回一个+ 2;
} / /功能(可以调用)的内存分配
函数表达式也可以赋值对象。
SomeElement.addEventListener(听到咔哒声,函数(){(){
someelement.style.backgroundcolor = '蓝色';
},假);
通过函数调用来分配内存
一些函数调用结果被分配对象内存:
复制代码代码如下所示:
新日期();
var = document.createelement('div '); / /分配一个DOM元素
有些方法分配新变量或新对象:
复制代码代码如下所示:
var s =AZERTY;
VaR S2 = s.substr(0, 3); / / S2是一个新的字符串
因为字符串是不变的,Javascript不分配内存,但只有0-3的存储范围。
var a = {ouais ouais
生成
a.concat VaR A3(A2); / / =新的阵列连接四个元素的数组,数组中的A2。
使用价值
使用值的过程实际上是读写分配内存的操作,这意味着我们可以编写变量或对象的属性值,甚至可以传递函数的参数。
不再需要使用时释放内存
大多数内存管理问题都在这个阶段。这里最困难的任务是找出分配的内存不再需要。它通常需要开发人员确定程序中不再需要的内存块并释放它。
高级语言解释器嵌入在垃圾收集器中。主要的任务是跟踪内存的分配和使用,这样当它不再使用时,它会自动释放分配的内存,这个过程是近似的,因为不可能确定一块内存是否需要确定(不能用某种算法来解决)。
垃圾收集
如上所述,不可能查明是否不再需要某些内存。因此,垃圾收集的实现只能局限于解决一般问题。
引用
垃圾收集算法主要依赖于参考的概念。在内存管理的环境中,如果一个对象可以访问另一个对象(隐式或显式),它被称为一个对象引用另一个对象。例如,一个Javascript对象参考其原型(暗示)和一个参考它的性质(显式引用)。
在这种情况下,对象的概念不仅是一个特殊的Javascript对象,而且是一个函数域(或全局词法范围)。
引用计数垃圾收集
这是最简单的垃圾收集算法,该算法不需要简化对象作为对象的定义或其他对象是否被引用,如果没有引用对象(零引用),则对象将被垃圾回收机制回收。
例如
复制代码代码如下所示:
var { { { {
{:
B:2
}
};
这两个对象被创建,另一个属性被引用,另一个被赋值给变量O。
显然,没有人可以被垃圾收集。
第二个变量是对这个对象的引用。
o = 1;现在,这个对象的原始引用O被O2替换
var是指对象的属性。
现在,这个对象有两个引用,一个是O2,一个是OA。
第一个对象现在是零引用。
他可以收集垃圾。
但是,它的对象的属性是对OA的引用,因此无法恢复。
一个对象属性现在是零引用。
它可以是垃圾回收
限制:循环引用
这种简单算法的局限性在于,如果一个对象引用另一个对象,则可能不需要它,但它们将不被恢复。
复制代码代码如下所示:
函数f(){
var;
var;
O = O2;O/O参考氧
O2 = O;O O / O2参考O
返回AZERTY;
}
(f);
这两个对象被创建,互相引用,形成一个圆。
他们在通话结束后没有离开功能范围。
所以它们不再使用,可以循环使用。
但是,考虑每个引用计数算法至少被引用一次,因此它们不会被循环使用。
现实的一个例子
IE 6, 7回收DOM对象的引用计数,对他们来说一个常见的问题是内存泄漏:
复制代码代码如下所示:
var div = document.createelement(div);
div.onclick =函数(){
DoSomething();
};
/ / DIV与参考属性onclick事件处理程序
事件处理也有一个对div的引用,可以在函数域中访问
这将导致一个循环引用,即不收集两个对象。
标记清除算法
该算法不需要简化对象的定义,就可以获得对象。
该算法假定一个对象称为根集(在Javascript中,根是一个全局对象)。定期对垃圾收集器将从根源入手,找到所有的物品,从根引用,并找到对象引用的对象…从根,垃圾收集器会发现所有的物体,可以得到所有的对象不可用。
该算法比以前的算法要好,因为零引用对象总是不可用,但相反,它不一定是循环引用。
自2012以来,所有的现代浏览器都使用标记-清除垃圾收集算法,改进了Javascript的垃圾收集算法是基于标记清除算法的改进,它不提高标记清除算法本身及其简化定义对象是否已不再需要。
循环引用不再是问题。
在上面的示例中,在返回函数调用后,不能从全局对象获得两个对象,因此,它们将由垃圾回收器回收。
在第二个示例中,一旦无法从根中获得div及其事件处理,它们将由垃圾回收器回收。
限制:对象需要显式地不可用。
虽然这是一个限制,但它很少被打破,这就是为什么现实中很少有人关心垃圾收集机制的原因。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。