源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

在JavaScript中使用inline函数的问题

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

扫一扫进微信版
返回顶部