在JavaScript中使用inline函数的问题_Javascript教程-查字典教程网
在JavaScript中使用inline函数的问题
在JavaScript中使用inline函数的问题
发布时间:2016-12-30 来源:查字典编辑
摘要:前段时间被IE和JavaScript脚本引擎的MemoryLeak问题弄得郁闷坏了,不过幸好现在总算是柳暗花明了,并且找到了一些IE中使用脚...

前段时间被IE和JavaScript脚本引擎的Memory Leak问题弄得郁闷坏了,不过幸好现在总算是柳暗花明了,并且找到了一些IE中使用脚本避免ML问题的方法。继续研究JavaScript的编写,有发现一些不算ML问题,但是可以节约IE内存使用的方法,在此和大家讨论讨论。

我们在JavaScript中编写代码,对于定义函数的语句: functionfoo()

{

//TODO: . . .

returnx;

}

可以说是在熟悉不过了。当然除了这种定义函数的方法,我们还有另外几种方法也能定义函数:

varfoo=function()

{

//TODO:. . .

returnx;

}

varfoo=newFunction('{/*todo*/returnx;}');

后两种方法定义的JavaScript函数,在调用起来和第一种没有任何效果上的区别。

不过由于JavaScript是解释性语言,当我们定义一个函数的时候,解析引擎生成一个Function对象实例,然后把函数内容保存下来。所以每执行一次函数定义语句,就会生成一个函数。而不像编译语言,一个函数编译一次后就被任何语句调用。啊?难道JavaScript不能调用定义好的函数?不是这个意思了,当我们在制作JavaScript控件时,如果动态输出DHTML来作为控件的内容,就容易出现这样的问题。比如我们在一个HTML对象生成过程中,使用了inline方式定义的函数,那么这个元素生成几次,那个函数也就要同时生成几次。

functionTestObject.prototype.Render(doc,id)

{

varspan=doc.createElement('SPAN');

span.Object=this;

this.m_Element=span;

if(id=="NamedMethod")

{

span.onclick=asdf;

}

else

{

span.onclick=function()

{

varasdf01=['a','s','d','f'];

varasdf02=['a','s','d','f'];

varasdf03=['a','s','d','f'];

varasdf04=['a','s','d','f'];

varasdf05=['a','s','d','f'];

varasdf06=['a','s','d','f'];

varasdf07=['a','s','d','f'];

varasdf08=['a','s','d','f'];

varasdf09=['a','s','d','f'];

varasdf10=['a','s','d','f'];

varasdf11=['a','s','d','f'];

varasdf12=['a','s','d','f'];

};

}

span.Name=this.m_Description;

span.innerText=this.m_Name;

span.style.display='block';

returnspan;

}

函数span.onclick = function()中的内容是用来占位置的,这样inline方式定义函数,每次Render()都就会生成一个新的函数对象。使用inline方式有什么不好呢?当对象实例多了的时候,会很明显的浪费内存空间呀,试验数据如下:

Normal Method Inline Method
Initialized 27.4M 27.4M
Rendered 33.4M 35.2 M

// IE消耗的内存数量(PM+VM)

单看绝对内存消耗差别不大,可是如果看相对内存消耗:(35.2-33.4)/(33.4-27.4) = 30% !!!,还是很可观的了,而且如果方法本省越大,inline时冗余数据就越多。

附测试代码: <html>

<head>

<title>JScriptFunctionSpending</title>

<metaname="author"content="birdshome@博客园"/>

</head>

<bodyonunload="ReleaseElements()">

<buttonid="NamedMethod"onclick="GenerateObjects(this)">

AppendNormalElements</button>

<buttonid="AnonymousMethod"onclick="GenerateObjects(this)">

AppendInlineElements</button>

<divid="container">

</div>

<scriptlanguage="Javascript">

functionGenerateObjects(elmt)

{

varroom=document.getElementById('container');

for(vari=0;i<1000;++i)

{

varobj=newTestObject('__Object__'+i);

room.appendChild(obj.Render(document,elmt.id));

}

}

functionTestObject(name)

{

this.m_Name=name;

this.m_Description='';

this.m_Element=null;

this.toString=function()

{

return'[classTestObject]';

}

}

functionTestObject.prototype.Render(doc,id)

{

varspan=doc.createElement('SPAN');

span.Object=this;

this.m_Element=span;

if(id=="NamedMethod")

{

span.onclick=asdf;

}

else

{

span.onclick=function()

{

varasdf01=['a','s','d','f'];

varasdf02=['a','s','d','f'];

varasdf03=['a','s','d','f'];

varasdf04=['a','s','d','f'];

varasdf05=['a','s','d','f'];

varasdf06=['a','s','d','f'];

varasdf07=['a','s','d','f'];

varasdf08=['a','s','d','f'];

varasdf09=['a','s','d','f'];

varasdf10=['a','s','d','f'];

varasdf11=['a','s','d','f'];

varasdf12=['a','s','d','f'];

};

}

span.Name=this.m_Description;

span.innerText=this.m_Name;

span.style.display='block';

returnspan;

}

functionasdf()

{

varasdf01=['a','s','d','f'];

varasdf02=['a','s','d','f'];

varasdf03=['a','s','d','f'];

varasdf04=['a','s','d','f'];

varasdf05=['a','s','d','f'];

varasdf06=['a','s','d','f'];

varasdf07=['a','s','d','f'];

varasdf08=['a','s','d','f'];

varasdf09=['a','s','d','f'];

varasdf10=['a','s','d','f'];

varasdf11=['a','s','d','f'];

varasdf12=['a','s','d','f'];

}

</script>

<scriptlanguage="javascript">

functionReleaseElements()

{

varroom=document.getElementById('container');

varspans=room.all.tags('SPAN');

for(vari=0;i<spans.length;++i)

{

spans[i].Object='';

}

}

</script>

</body>

</html>

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类