在JavaScript中使用inline函数的问题

简介:

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

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

None.gif function foo()
None.gif{
None.gif     //  TODO: . . .
None.gif
     return x;
None.gif}

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

None.gif var foo =  function()
None.gif{
None.gif     //  TODO: . . .
None.gif
     return x;
None.gif}

None.gif var foo =  new Function('{ /* todo */ return x;}');

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

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

None.gif  function TestObject.prototype.Render(doc, id)
None.gif {
None.gif     var span = doc.createElement('SPAN');
None.gif    span.Object =  this;
None.gif     this.m_Element = span;
None.gif
None.gif     if ( id == "NamedMethod" )
None.gif    {
None.gif        span.onclick = asdf;
None.gif    }
None.gif     else
None.gif    { 
None.gif        span.onclick =  function()
None.gif        {
None.gif             var asdf01 = ['a', 's', 'd', 'f'];
None.gif             var asdf02 = ['a', 's', 'd', 'f'];
None.gif             var asdf03 = ['a', 's', 'd', 'f'];
None.gif             var asdf04 = ['a', 's', 'd', 'f'];
None.gif             var asdf05 = ['a', 's', 'd', 'f'];
None.gif             var asdf06 = ['a', 's', 'd', 'f'];
None.gif             var asdf07 = ['a', 's', 'd', 'f'];
None.gif             var asdf08 = ['a', 's', 'd', 'f'];
None.gif             var asdf09 = ['a', 's', 'd', 'f'];
None.gif             var asdf10 = ['a', 's', 'd', 'f'];
None.gif             var asdf11 = ['a', 's', 'd', 'f'];
None.gif             var asdf12 = ['a', 's', 'd', 'f'];
None.gif        };
None.gif    }
None.gif    span.Name =  this.m_Description;
None.gif    span.innerText =  this.m_Name;
None.gif    span.style.display = 'block';
None.gif     return span;
None.gif }

    函数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时冗余数据就越多。

    附测试代码:
None.gif < html >
None.gif < head >
None.gif     < title >JScript Function Spending </ title >
None.gif     < meta  name ="author"  content ="birdshome@博客园"   /> 
None.gif </ head >
None.gif < body  onunload ="ReleaseElements()" >
None.gif     < button  id ="NamedMethod"  onclick ="GenerateObjects(this)" >
None.gif        Append Normal Elements </ button >
None.gif     < button  id ="AnonymousMethod"  onclick ="GenerateObjects(this)" >
None.gif        Append Inline Elements </ button >
None.gif     < div  id ="container" >
None.gif     </ div >
ContractedBlock.gif     < script  language ="Javascript" > dot.gif </ script >
ContractedBlock.gif     < script  language ="javascript" > dot.gif </ script >
None.gif </ body >
None.gif </ html >
None.gif

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
20天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
20天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
11 0
|
21天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
1月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=&gt;`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
18 5
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
17 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发
javascript箭头函数
javascript箭头函数
|
1月前
|
JavaScript 小程序
微信小程序 wxml 中使用 js函数
微信小程序 wxml 中使用 js函数
71 0
|
1月前
|
JavaScript 前端开发
JavaScript函数科里化
JavaScript函数科里化