我必须维护一个包含30-40个属性的JavaScript对象,我每隔几秒就会更新一次.我已经读过在JavaScript中没有"释放"内存,浏览器会自动垃圾收集未使用的内存.
我的问题是:是否足以将对象本身设置为null,或者我是否需要将其所有属性设置为null然后将其设置为null?
var obj = [];
obj[prop1] = "123";
obj[prop2] = "456";
//...and so on...
// now to release the obj, is it enough if I just did:
obj = null;
Run Code Online (Sandbox Code Playgroud) 我正在研究一个包含大量Javascript的AJAX应用程序.所有页面都通过AJAX加载.
在某个页面上,我有一个用Javascript构建的网格.现在,当我离开那个页面时,我想破坏那个网格.我调用jQuery.remove()但这只是从DOM中删除对象.
我的问题是如何从内存中删除此网格对象?因为当我离开页面时它仍然存在.
非常感激!
我目前有一个运行大约200次的功能.
功能看起来像这样:
function GetB(av,bol){
var bxes=[
["11","12","13","21","22","23","31","32","33"],
["14","15","16","24","25","26","34","35","36"],
["17","18","19","27","28","29","37","38","39"],
["41","42","43","51","52","53","61","62","63"],
["44","45","46","54","55","56","64","65","66"],
["47","48","49","57","58","59","67","68","69"],
["71","72","73","81","82","83","91","92","93"],
["74","75","76","84","85","86","94","95","96"],
["77","78","79","87","88","89","97","98","99"]
];
//code
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是这个数组正在减慢一切因为我认为它每次都重写数组bxes(或类似的东西)
这个bxes数组永远不会被修改,我不介意把它变成一个全局数组.
我目前正在使用Javascript构建游戏.经过一些测试后,我开始注意到偶然的延迟,这只会是由GC引起的.我决定在它上面运行一个配置文件.结果表明GC实际上是罪魁祸首:
我读到创建新对象会导致很多GC.我想知道是否有这样的事情:
var x = [];
Run Code Online (Sandbox Code Playgroud)
也创建任何Garbage,因为Java中的原始类型不会这样做.由于Javascript中没有真正的类型,我不确定.此外,哪一个最适合创建最少量的垃圾:
选项1:
function do() {
var x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
选项2:
var x = [];
function do() {
x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
选项3:
function do() {
x = [];
...
}
Run Code Online (Sandbox Code Playgroud)
或选项4:
function do() {
var x = [];
...
delete x;
}
Run Code Online (Sandbox Code Playgroud)
选项5:
var x = [];
function do() {
x.length = 0;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的案例中,do函数被称为30次/秒.它在阵列上运行几个操作.
我想知道这一点,因为我只是将我的所有变量全局化以试图阻止它们被GC收集,但GC没有太大变化.
您是否也可以提供一些常见的例子来说明会产生大量垃圾和一些替代品.
谢谢.
JavaScript支持垃圾收集吗?
例如,如果我使用:
function sayHello (name){
var myName = name;
alert(myName);
}
Run Code Online (Sandbox Code Playgroud)
我是否需要使用"删除"来删除myName变量,或者我只是忽略它?
以下HTML和JavaScript取自本jsFiddle的部分内容:http: //jsfiddle.net/stephenjwatkins/2j3ZB/3/
HTML:
<p class="source">
Source
</p>
<div id="target">
<p class="dummy">
Target
</p>
</div>
<button id="transfer-button">Transfer</button>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
var sourceEl = $('.source');
var targetEl = $('#target');
$('#transfer-button').click(function() {
targetEl.html('<p class="dummy">Transferring...</p>');
setTimeout(function() {
// Source element will be empty on second attempt to append
targetEl.html('').append(sourceEl);
}, 750);
return false;
});?
Run Code Online (Sandbox Code Playgroud)
请注意,setTimeout和虚拟文本仅用于可视指示器.
可以看出,在从DOM添加和删除源元素之后,IE(所有版本)将在任何进一步追加时向DOM添加空元素; 而所有其他浏览器都会添加正确的非空元素.
另一个增加混淆的方面是sourceEl仍然具有元素信息(例如sourceEl.attr('class')将返回"source").
我知道减轻问题的方法(例如sourceEl.clone()),但是如果能够更好地理解为什么IE的行为方式不同以避免将来出现任何相关问题,那将会很好.
一旦替换元素,是什么导致源元素在IE中唯一地为空?
所以我有panel(让它叫它fooPanel)包含一个grid(让我们调用,如果fooGrid,有一些store).fooPanel可以插入一些tabpanel.所以事实是,有可能tabpanel包含两个(或更多)实例fooPanel,带有一些不同的参数.我认为这个问题很明显.由于与fooGrids面板的相同stores,只要我重新加载一个商店,两者fooGrids都被重新加载.(因为他们有相同的stores).这个问题有方法解决吗?或者我应该限制用户只打开一个fooPanelper的实例tabpanel
我知道闭包通过保存对已执行函数的引用来保持执行上下文的活跃性.
我想知道整个上下文是保存还是仅保存所需的部分.
在前一种情况下,我需要以不浪费内存的方式构造函数.无论如何,这应该是设计目标,但我想知道JavaScript是否也会处理它.
这是一个简单的例子(基于单页Web应用程序,Mikowski/Powell,第56页):
var ctx;
var outer_function = function () {
var dummy = 'not required for output';
var output = 'output';
var inner_function = function () {
return { output: output };
}
return inner_function;
};
ctx = outer_function();
// returns { output: 'output' }
ctx();
Run Code Online (Sandbox Code Playgroud)
dummy对象在执行后是否存储在闭包中,
outer_function即使它不可访问也不会被使用?
我正在努力确保当我完成它们时,包含在闭包中的一些变量将被释放用于垃圾收集.我不确定天气将它们设置为未定义,或者删除它们就足够了.有什么想法吗?
// run once for each photo, could be hundreds
$("img.photo").each( function(){
// create the vars to put in the callback
var photo = $(this);
var tmp = new Image();
// set the callback, wrapping the vars in its scope
tmp.onload = (function(p,t){
return function(){
// do some stuff
// mark the vars for garbage collection
t.onload = ?
t = ?
p = ?
})(photo, tmp)
// set the source, which calls onload when loaded
tmp.src = photo.attr("src")
})
Run Code Online (Sandbox Code Playgroud) 我有一个按钮单击事件,它抓取与选中的复选框相关联的名称,并将它们添加到<ul>页面右侧的复选框中.这工作得很好,那么我还有一个按钮,将捞出<li>的检查与checkboxes从<ul>.这很有用.当你去添加一个已从右侧删除的项目时,问题就来了.该项目不在页面上,因此它显然已从DOM中删除,但就好像它仍然存储在浏览器内存中一样.如何清除内存?代码如下.
$('.add-people').click(function () {
$('.add-names:checked').each(function () {
var name = $(this).parent().siblings('td.name-cell').html();
if ($('ul.group-list').find(':contains(' + name + ')').length) {
//Name is already in list
} else {
var newLi = '<li><input id="name" class="remove-names" type="checkbox" name="' + name + '"><span>' + name + '</span></li>'
$('ul.group-list').append(newLi);
}
});
});
$('.remove-people').click(function () {
$('.remove-names:checked').each(function () {
$(this).parent().remove();
});
});
Run Code Online (Sandbox Code Playgroud) javascript ×8
jquery ×2
memory ×2
closures ×1
dom ×1
extjs ×1
object ×1
performance ×1
store ×1