我是jQuery的新手.我有点困惑,无论是罚款还是可能导致内存泄漏?

这是代码:在每个新值的某些日期过滤器上调用此方法

function preapretooltip(chart) {
    var tickLength = chart.xAxis[0].tickPositions.length,ticks = chart.xAxis[0].ticks,tickPositions = chart.xAxis[0].tickPositions;
    for ( var iCntr = 0; iCntr < tickLength; iCntr++) {
         var tickVal = tickPositions[iCntr];

    //.label or .mark or both
    (function(tickVal) { // Is this good practice to call function like this?
        ticks[tickVal].label
        .on('mouSEOver',function(event) { // Is this good practice to call function like this?
            var label = '',labelCnt=0;
            $(chart.series).each(function(nCntr,series) {
                //business logic for each series
            });

           // calling method to show values in a popup
        });

        ticks[tickVal].label.on('mouSEOut',function(event) { // Is this good practice to call function like this?
            try {
                hideWrapper(); // hides popup
            } catch (e) {
            // do nothing
            }
        });

    })(tickVal);
  }
}

解决方法

尽管编写大型纯JavaScript项目时需要避免使用浏览器特定问题,但在使用jQuery等库时,应该假设库的设计可以帮助您避免这些问题.然而,考虑到内存泄漏很难被追踪,特定浏览器的每个不同版本的行为可能会有所不同 – 知道如何通常避免内存泄漏而不是具体的情况要好得多:

>如果您的代码被多次迭代,请确保您正在使用的变量可以通过垃圾回收进行丢弃,而不是封闭引用.
>如果您的代码处理大型数据结构,请确保您具有删除或取消数据的方法.
>如果你的代码构造了很多对象,函数和事件监听器,那么总是最好包含一些解构代码.
>尽量避免将javascript对象或函数作为属性直接附加到元素 – 即element.onclick = function(){}.
>如果有疑问,您的代码完成后总是整理.

你似乎认为这是调用一个会影响泄漏的功能的方法,但是它总是更有可能成为可能导致问题的那些功能的内容.

有了你的代码,我唯一的建议是:

>每当使用事件侦听器尝试找到重用函数的方法,而不是为每个元素创建一个函数.这可以通过使用event delegation(捕获祖先/父项上的事件并将反应委托给event.target)来实现,或者编码一个单一的通用函数,以相对方式处理元素,最常见的是相对于这个或$(这个).
>当需要创建许多事件处理程序时,通常最好将这些事件侦听器存储为命名函数,以便在完成后再次删除它们.这将意味着避免使用匿名函数.但是,如果您知道只有您的代码处理DOM,则可以使用$(elements).unbind(‘click’)来删除所有使用jQuery应用于所选元素的点击处理程序(匿名).如果您使用后一种方法,那么使用jQuery的事件命名空间能力肯定会更好 – 这样你才知道你只是删除你的事件.即$(元素).unbind(‘click.my_app’);.这显然意味着您必须使用$(elements).bind(‘click.my_app’,function(){…})绑定事件;

更具体:

自动调用匿名函数

(function(){
  /*
   running an anonymous function this way will never cause a memory
   leak because memory leaks (at least the ones we have control over) 
   require a variable reference getting caught in memory with the 
   JavaScript runtime still believing that the variable is in use,when it isn't - meaning that it never gets garbage collected. 
   This construction has nothing to reference it,and so will be 
   forgotten the second it has been evaluated.
  */
})();

用jQuery添加一个匿名事件监听器:

var really_large_variable = {/*Imagine lots of data here*/};

$(element).click(function(){
  /*
   Whilst I will admit not having investigated to see how jQuery
   handles its event listeners onunload,I doubt if it is auto-
   matically unbinding them. This is because for most code they
   wont cause a problem,especially if only a few are in use. For
   larger projects though it is a good idea to create some beforeunload
   or unload handlers that delete data and unbind any event handling.
   The reason for this is not to protect against the reference of the
   function itself,but to make sure the references the function keeps
   alive are removed. This is all down to how JS scope works,if you
   have never read up on JavaScript scope... I suggest you do so.

   As an example however,this anonymous function has access to the
   `really_large_variable` above - and will prevent any garbage collection
   system from deleting the data contained in `really_large_variable`
   even if this function or any other code never makes use of it. 
   When the page unloads you would hope that the browser would be able
   to kNow to clear the memory involved,but you can't be 100% certain
   it will *(especially the likes of IE6/7)* - so it is always best
   to either make sure you set the contents of `really_large_variable` to null
   or make sure you remove your references to your closures/event listeners.
  */
});

撕裂和解构

关于我的解释,我已经专注于何时不再需要该页面,并且用户正在导航.然而,在当今世界的内容和高度动态的界面上,这些变得更加相关;不断创建和删除元素的GUI.

如果您正在创建一个动态的JavaScript应用程序,我不能强调在不再需要代码时执行的.tearDown或.deconstruct方法的构造函数是多么重要.这些应该逐步通过大型自定义对象构造并使其内容无效,以及删除动态创建并且不再使用的事件侦听器和元素.在替换元素的内容之前,您还应该使用jQuery的空方法 – 这可以用他们的话更好地解释:

http://api.jquery.com/empty/

To avoid memory leaks,jQuery removes other constructs such as data and event handlers from the child elements before removing the elements themselves.

If you want to remove elements without destroying their data or event handlers (so they can be re-added later),use .detach() instead.

不仅使用tearDown方法进行编码会使您更加干练(即确保将相关代码,事件和元素命名为一起保留),这通常意味着您以更模块化的方式构建代码;这对于未来的应用程序,阅读能力以及可能在以后接管您的项目的任何其他人来说显然更好.

避免内存泄漏/使用Javascript的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  8. ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?

    使用Xcode附带的spritekit模板,我修改场景如下:该应用程序似乎继续使用更多内存,直到它挂起或崩溃.使用泄漏和分配工具,我发现了以下内容:泄漏:分配:从图像中可以看出,存在大量使用内存的Malloc调用.我不直接调用Malloc–似乎这些调用是由SpriteKit完成的.同样,存在许多内存泄漏,这似乎也是由于SKShapeNode,SKNode或其他SpriteKit对象造成的.我如何解决或解决此内存(泄漏)问题?

  9. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  10. ios – Xcode显示内存泄漏,但仪器没有

    当我从Xcode运行我的应用程序时,很明显我有一个内存泄漏:当我提供一个自定义的ViewController时,内存增加,但是当我关闭它时,它不会退回.所以我也检查了使用仪器的分配工具,但这说明了一个不同的故事:可以看出,当我呈现ViewController时,仪器会显示尖峰,但是当内存使用被关闭时,内存使用率将恢复到以前的级别.我已经检查了我的代码至少15次,我个人无法找到任何内存泄漏,因此同意

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部