Javascript类初始化和内存中的jQuery DOM

时间:2012-11-14 18:52:26

标签: javascript performance memory-leaks

以下是最佳方式:

var myClass = function() {
    this.myContainer = function(){ return $(".container");}
    this.mySubContainer = function(){ return this.myContainer().find(".sub"); }
}

AND

var myClass = function() {
    this.myContainer = $(".container");
    this.mySubContainer = this.myContainer.find(".sub");
}

有没有具体的差异?

当我看到我的网页有足够的javascript(大约150KB的我的+ libs)占用超过300-400MB的内存时出现了内存问题。我试图找出问题,我不知道这可能是其中之一。

4 个答案:

答案 0 :(得分:2)

function myClass{
    this.myContainer = function(){ return $(".container");}
    this.mySubContainer = function(){ return this.myContainer().find(".sub"); }
}

在这里你需要调用类似myClassInstance.myContainer()的东西,这意味着jquery会在你使用该函数时搜索.container元素。此外,每当您创建类的新实例时,它将创建2个额外的闭包。这需要一些额外的记忆。

function myClass{
    this.myContainer = $(".container");
    this.mySubContainer = this.myContainer.find(".sub");
}

在这里,您将myContainer指向一个已包含DOM节点所有链接的对象。任何时候使用myClassInstance.myContainer

时,jQuery都不会搜索DOM

因此,如果您不想放慢应用程序的速度,第二种方法会更好。但是,如果经常修改DOM,第一种方法可能会有用。但我并不认为你经常修改它可能需要使用第二种方法。

答案 1 :(得分:0)

如果您要分配一个变量,那么第二种方法看起来更清晰..

答案 2 :(得分:0)

是的,他们是不同的。

模型1:

在第一个模型中,myContainer是一个函数变量。它不包含jQuery对象。你不能在objet上调用任何jQuery的方法。要实际获取jQuery对象,您必须说

var obj = this.myContainer()this.myContainer.call()

模型2:

第二个模型存储实际的jQuery对象。

尝试在两个模型中提醒this.myContainer,你会看到差异。

答案 3 :(得分:0)

是的,这是不同的。修复语法错误后:

  

function myClass(){... //括号

<强>第一

当你创建一个新对象var obj = new myClass()时,你正在创建两个函数,并且在你调用它之前不会返回jquery对象

var container = obj.myContainer();

第二次

初始化对象后,访问dom并缓存对象以供以后使用;

var container = obj.myContainer;