作家
登录

在JavaScript中使用inline函数的问题

作者: 来源:www.28hudong.com 2013-03-30 03:40:09 阅读 我要评论

前段时间被IE和JavaScript脚本引擎的Memory Leak问题弄得郁闷坏了,不过幸好现在总算是柳暗花明了,并且找到了一些IE中使用脚本避免ML问题的方法。继续研究JavaScript的编写,有发现一些不算ML问题,但是可以节约IE内存使用的方法,在此和大家讨论讨论。 我们在JavaScript中编写代码,对于定义函数的语句: function foo(){ // TODO: . . . return x;} 可以说是在熟悉不过了。当然除了这种定义函数的方法,我们还有另外几种方法也能定义函数: var foo = function(){ // TODO: . . . return x;} var foo = new Function('{/*todo*/return x;}'); 后两种方法定义的JavaScript函数,在调用起来和第一种没有任何效果上的区别。 不过由于JavaScript是解释性语言,当我们定义一个函数的时候,解析引擎生成一个Function对象实例,然后把函数内容保存下来。所以每执行一次函数定义语句,就会生成一个函数。而不像编译语言,一个函数编译一次后就被任何语句调用。啊?难道JavaScript不能调用定义好的函数?不是这个意思了,当我们在制作JavaScript控件时,如果动态输出DHTML来作为控件的内容,就容易出现这样的问题。比如我们在一个HTML对象生成过程中,使用了inline方式定义的函数,那么这个元素生成几次,那个函数也就要同时生成几次。 function TestObject.prototype.Render(doc, id) { var span = doc.createElement('SPAN'); span.Object = this; this.m_Element = span; if ( id == "NamedMethod" ) { span.onclick = asdf; } else { span.onclick = function() { var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f']; }; } span.Name = this.m_Description; span.innerText = this.m_Name; span.style.display = 'block'; return span; } 函数span.onclick = function()中的内容是用来占位置的,这样inline方式定义函数,每次Render()都就会生成一个新的函数对象。使用inline方式有什么不好呢?当对象实例多了的时候,会很明显的浪费内存空间呀,试验数据如下: Normal Method Inline Method Initialized 27.4 M 27.4 M Rendered 33.4 M 35.2 M // IE消耗的内存数量(PM+VM) 单看绝对内存消耗差别不大,可是如果看相对内存消耗:(35.2-33.4)/(33.4-27.4) = 30% !!!,还是很可观的了,而且如果方法本省越大,inline时冗余数据就越多。 附测试代码: <html><head> <title>JScript Function Spending</title> <meta name="author" content="birdshome@博客园" /> </head><body onunload="ReleaseElements()"> <button id="NamedMethod" onclick="GenerateObjects(this)"> Append Normal Elements</button> <button id="AnonymousMethod" onclick="GenerateObjects(this)"> Append Inline Elements</button> <div id="container"> </div> <script language="Javascript">function GenerateObjects(elmt){ var room = document.getElementById('container'); for ( var i=0 ; i < 1000 ; ++i ) { var obj = new TestObject('__Object__' + i); room.appendChild(obj.Render(document, elmt.id)); } }function TestObject(name){ this.m_Name = name; this.m_Description = ''; this.m_Element = null; this.toString = function() { return '[class TestObject]'; }}function TestObject.prototype.Render(doc, id){ var span = doc.createElement('SPAN'); span.Object = this; this.m_Element = span; if ( id == "NamedMethod" ) { span.onclick = asdf; } else { span.onclick = function() { var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f']; }; } span.Name = this.m_Description; span.innerText = this.m_Name; span.style.display = 'block'; return span;}function asdf(){ var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f'];}</script> <script language="javascript">function ReleaseElements(){ var room = document.getElementById('container'); var spans = room.all.tags('SPAN'); for ( var i=0 ; i < spans.length ; ++i ) { spans[i].Object = ''; }} </script></body></html>

  推荐阅读

  JS类库Bindows1.3中的内存释放方式分析

我在前段时间介绍过IE中JavaScript脚本Memory Leak的问题,后来在几位热心网友的讨论下,基本认可了内存泄露的事实和原理。在小规模的测试case下,本来都达到了基本避免IE中脚本的ML问题。可是近来发现只以"仔细"来>>>详细阅读


本文标题:在JavaScript中使用inline函数的问题

地址:http://www.17bianji.com/kaifa2/JS/30825.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)