Kon*_*rad 21 javascript garbage-collection memory-management
来自C++,每当我打电话给new我的电话时,我都会感到难以理解delete.在JavaScript中,我发现自己new偶尔在我的代码中调用,但是(希望)浏览器中的垃圾收集功能将为我处理混乱.
我不喜欢这个 - delete在JavaScript中有一个方法,我是如何使用它与C++不同的?
谢谢.
MBO*_*MBO 24
var component = new Component();
component = null; // delete this at next garbage collection
Run Code Online (Sandbox Code Playgroud)
mor*_*des 13
顺便说一下,"new"关键字在javascript中并不是必需的,并且没有(直接)与分配内存有关.所有"new"都会传递一个名为"this"(this = {})的新空对象作为函数的隐藏参数.
var MyClass = function(){
// fresh empty object "this" gets passed to function
// when you use the "new" keyword
this.method = function(){}
}
var myInstance = new MyClass();
Run Code Online (Sandbox Code Playgroud)
Javascript可以通过嵌套闭包和多个"this"变量在不同的范围内浮动而变得有点毛茸茸.我更喜欢这样做:
var MyNoNewClass = function(){
// I find this more explicit and less confusing
var self = {}
self.method = function(){}
return self;
}
var myNoNewInstance = MyNoNewClass()
Run Code Online (Sandbox Code Playgroud)
引用了所有JavaScript内存,但不是传统意义上的.内存不是由内存地址引用,而是由字符串引用.在这段代码中:
var x = new someObj();
Run Code Online (Sandbox Code Playgroud)
从该点开始,该对象由字符串"x"引用.x不是指向堆上某些内存的指针.如果你分配了xa属性,那么:
x.someProp = 42;
Run Code Online (Sandbox Code Playgroud)
然后someProp是内存中引用值42的字符串.因此,它允许您使用数组表示法通过它的字符串表示来访问它:
x["someProp"]++;
Run Code Online (Sandbox Code Playgroud)
这也是变量可以保持任何值的原因,因为它们不需要大小.
当没有更多的字符串(也就是变量或属性名称)引用它时,内存是用JavaScript收集的.当x被赋予任何其他值时,将收集该对象.您可以将其设置为null,undefined或其他任何内容,并将收集内存.
也就是说,当浏览器或任何JavaScript引擎转向它时,它将被收集.
删除仅从对象中删除属性.从那时起,试图访问该属性将返回undefined.在大多数情况下,以下两行代码是等效的:
x["someProp"] = undefined;
delete x.someProp;
Run Code Online (Sandbox Code Playgroud)
编辑:好的,内部两条线不一样.删除操作符将从内存中删除"someProp"引用,而将其设置为undefined则不会.我认为.我在规范中找不到任何关于将变量或属性设置为undefined的内容,但我不认为这样做有什么特别之处.
需要注意的重要一点是,您将无法删除具有某个标志集的属性,但您可以将它们设置为null或undefined(如果它们没有被setter包装,甚至允许这种情况发生).
| 归档时间: |
|
| 查看次数: |
8450 次 |
| 最近记录: |