Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.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/8/magento/5.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内存使用管理_Javascript_Jquery_Javascript Events - Fatal编程技术网

Javascript内存使用管理

Javascript内存使用管理,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我正在建立一个使用大量javascript的大型网站,我所有的内容都是通过ajax加载的,它与facebook非常相似,因为有很多不同的页面,我需要很多javascript,所以我想到的是将我的脚本分成几个部分,每个页面都有自己的脚本文件 现在加载很简单,我只需在每个页面上加载一个新文件,但我关心的是,如果用户浏览100个不同的页面并加载100个不同的脚本文件,会发生什么 目前,我的网站没有那么多的页面,但我很确定,在未来的某个时候,它将增长到近100个独特的页面 那么,使用较慢计算机的用户会发

我正在建立一个使用大量javascript的大型网站,我所有的内容都是通过
ajax
加载的,它与facebook非常相似,因为有很多不同的页面,我需要很多javascript,所以我想到的是将我的脚本分成几个部分,每个页面都有自己的脚本文件

现在加载很简单,我只需在每个页面上加载一个新文件,但我关心的是,如果用户浏览100个不同的页面并加载100个不同的脚本文件,会发生什么

目前,我的网站没有那么多的页面,但我很确定,在未来的某个时候,它将增长到近100个独特的页面

那么,使用较慢计算机的用户会发生什么情况呢?我猜它会开始慢很多,因为不会有刷新。从我读到的内容来看,以任何简单的方式从加载的脚本文件中卸载所有事件和数据是不可能的,如果我尝试这样做,可能会花费我大量的时间和精力

所以我的问题是,我应该保持现状还是尝试做点什么?我目前使用的
jquery
插件很少,如果我不得不猜测平均文件大约有50-200行代码,其中大部分是
单击事件和
ajax
调用

注意,每个页面对象对于每个类都有自己的前缀,例如:
home\u头
login\u头

因此,
onClick
事件监听器和类似的东西之间不应该有任何冲突


编辑我在这个问题上设置了悬赏,我想听听更多的意见。

如果你循环使用变量并且不污染全局范围,你就走上了正确的道路;但是关于你的问题,你应该首先弄清楚这是否是一个实际问题


这可以通过探查器进行检查和监控,只需在URL中键入
about:memory
,它将为您提供每个选项卡的细分,甚至可以让您比较浏览器之间的内存使用情况。如果您设置了一些自动测试场景(或者愿意手动浏览100页),这样的评测将告诉您网站是否存在严重问题。

仅仅因为您使用的是AJAX,并不意味着内存使用会自动发出警报。。。您应该更加担心会导致内存泄漏的事情,并确保正确地进行破坏和构造:

作为一项规则,在任何大型系统中,我都倾向于创建一个帮助器构造函数,它跟踪我可能希望在以后销毁的所有项目或页面卸载(事件侦听器、大型属性或对象结构),所有这些项目都由命名空间索引。然后,当我处理完一个特定的部分或实体后,我要求助手系统(我称之为GarbageMonkey:)清除一个特定的名称空间

  • 对于事件,它解除绑定
  • 对于属性,它将取消设置
  • 对于数组/对象,它扫描和取消设置每个键,也可以对子元素进行扫描和取消设置
  • 对于元素,它会尽可能多地删除和清理内容
  • 显然,要使上述方法起作用,您需要小心不要留下变量,这些变量可能会保留对希望删除的数据的引用。所以这意味着意识到什么是,什么是;他们之间如何让一个变量永远活着。。或者至少直到浏览器/选项卡被销毁。这还意味着使用对象结构而不是变量,因为您可以删除任何有权访问对象的范围中的键,但不能删除变量

    这样做:

    var data = {}, methods = {}, events = {};
    
    methods.aTestMethod = function(){
      /// by assigning properties to an object, you can easily remove them later
      data.value1 = 123;
      data.value2 = 456;
      data.value3 = 789;
    }
    
    与此相反:

    var value1, value2, value3;
    
    var aTestMethod = function(){
      value1 = 123;
      value2 = 456;
      value3 = 789;
    }
    
    原因是,在上述情况下,您可以稍后执行此操作:

    var i;
    for( i in methods ){ delete methods[i]; }
    for( i in data ){ delete data[i]; }
    
    但你不能这样做:

    delete value1;
    delete value2;
    delete value3;
    

    显然,上述内容无法保护您免受直接指向
    方法
    数据
    的子元素的引用。但是,如果您只在代码中传递
    方法
    数据
    对象,并且在将方法附加为事件侦听器方面保持整洁,那么即使您最终得到了恶意引用,它也应该只指向空对象(在您删除了该对象的内容之后).

    有两件事需要注意:

    -内存使用

    -内存泄漏

    对于长时间运行的Web应用程序,应该绝对避免内存泄漏,否则用户将遇到浏览器崩溃。要监视内存使用情况,可以下载process explorer:

    禁用所有浏览器插件,然后使用应用程序并执行重复任务。如果内存使用增加,则会出现泄漏。IE7-IE8确实比现代浏览器更容易泄漏,并且更难调试,因此了解浏览器兼容性的最低要求非常有用

    对于内存使用,以下几点有助于减轻应用程序的重量:

    • 使用事件委派,而不是通过dom元素循环并附加事件处理程序函数。埃德在这里真是一把金枪

    • 对于IE 7/8,var无效化是必要的,我认为它对现代浏览器仍然有帮助(需要一些测试)。为此,还需要命名函数,以便从内存中删除它们。(有关这方面的更多详细信息,请参见pebbl答案)

    • 保持对dom大小的控制。为功能添加节点时,如果不再使用此功能,也应删除节点

    • 向所有组件添加一些处理卸载的teardown()方法

    好的,很抱歉,我在这里有点太快了,但如果知道:

  • 你的最小浏览器是什么

  • 如果您检测到泄漏

  • 如果ED是一个充分的解决方案(通常是)


  • 我会考虑使用一个像脊椎这样的图书馆来更好地组织它,你可以通过保持整洁来获得一些性能。我们能看看你的代码吗?也许优化就是k