Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数中创建jQuery对象而不使用它是否会导致内存泄漏?_Javascript_Jquery_Html_Angularjs - Fatal编程技术网

Javascript 在函数中创建jQuery对象而不使用它是否会导致内存泄漏?

Javascript 在函数中创建jQuery对象而不使用它是否会导致内存泄漏?,javascript,jquery,html,angularjs,Javascript,Jquery,Html,Angularjs,例如: function getTimeFromMin(min) { var tempTime = new Date(); tempTime.setHours(0, min, 0, 0); return angular.element('<input type="hidden"/>').timepicker('setTime', tempTime).val(); } 函数getTimeFromMin(min){ var testime=新日期(); 设置小时

例如:

function getTimeFromMin(min) {
    var tempTime = new Date();
    tempTime.setHours(0, min, 0, 0);
    return angular.element('<input type="hidden"/>').timepicker('setTime', tempTime).val();
}
函数getTimeFromMin(min){ var testime=新日期(); 设置小时数(0,分钟,0,0); 返回angular.element(“”).timepicker('setTime',testime).val(); }
我只得到了值,但创建的元素会发生什么变化?它是被收集的还是我应该删除元素并分别返回val()?

到今天为止的答案是肯定的,您的函数很可能会泄漏内存,但这完全取决于
计时器
函数的功能。在这个回答中,我假设它是一个jqueryui风格的小部件,这意味着它使用
jQuery.prototype.data
存储一个对象

由于旧浏览器中存在垃圾收集问题,存储此数据的实际对象不是元素本身,而是一个单独的对象。通过引用该对象中与jQuery创建的元素上的expando属性相对应的属性来检索数据。为了避免内存泄漏,您需要对已创建的元素调用
.remove
函数,以便删除我前面提到的对象中的数据缓存

基本上,将代码更改为:

var tmp = angular.element('<input type="hidden"/>').timepicker('setTime', tempTime),
    val = tmp.val();

tmp.remove();
return val;
var tmp=angular.element(“”).timepicker('setTime',testime),
val=tmp.val();
tmp.remove();
返回val;

在jQuery的未来版本(3.X及更高版本)中,这个答案可能是无效的。我相信他们正在考虑将来直接将数据附加到DOM元素,因为较新的浏览器不像较旧的浏览器那样具有垃圾收集。或者,一旦EcmaScript 6获得了广泛的浏览器支持,他们可能会开始使用
WeakMap
作为对象存储,但在相当长的一段时间内,不要期望这样做。

如果小部件构建正确,您可以销毁它。