在JavaScript中使用inline函数的问题

2016-02-19 10:29 54 1 收藏

想要天天向上,就要懂得享受学习。图老师为大家推荐在JavaScript中使用inline函数的问题,精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

【 tulaoshi.com - Web开发 】

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

    我们在JavaScript中编写代码,对于定义函数的语句: function foo()
{
    // TODO: . . .
    return x;
}

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)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方式有什么不好呢?当对象实例多了的时候,会很明显的浪费内存空间呀,试验数据如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)     Normal Method  Inline Method  Initialized  27.4 M27.4 M Rendered  33.4 M35.2 M
    // IE消耗的内存数量(PM+VM)

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

    附测试代码: html
head
    titleJScript 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

来源:https://www.tulaoshi.com/n/20160219/1594784.html

延伸阅读
标签: Web开发
在Javascript里,有两种使用正则的方法,一是创建一个正则表达式的实例,而是使用String对象里的正则表达相关的方法. 首先是正则表达式的创建,有2种办法: var my_regex=/[a-z]+/g; var my_regex=new ("[a-z]+","g"); 方法 exec(string),对string进行正则处理,并返回匹配结果. test(string),测试string是否含有匹配结果 字符串对象中的...
标签: Web开发
Javascript的getYear()函数本意是提取获得当前年份,比如 script type="text/javascript"var nowd = new Date();var yf = nowd.getYear();alert(yf);/script [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行] 在IE浏览器下解释执行为正确的2008,而是FF等浏览器下则解释为108 原因则是 在 FF等浏览器内 getYear 返...
第一步:Excel中选择好D1,然后在菜单栏里选择插入,在下拉栏中选择名称,定义。 第二步:出现定义对话框,然后在名称中输入X,在下面的应用位置输入=EVALUATE(Sheet1!$A1)公式,点击添加,然后确定。 第三步:然后我们在D1的单元格内输入=X。 第四步:这样在D1...
曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm:ss,而我们查询时是通过yyyy-mm-dd来进行的,即查询某一天的所有会议信息,这样如果通过select * from Meeting where PublishTime=@PublishTime ...
标签: Web开发
《JavaScript语言精髓与编程实践》的读者I22141提出了一问题:为什么下面这段代码在JScript和SpiderMonkey中表现不一样: -------- var func = eval("(function(){})"); alert(typeof func); -------- 更进一步的问题是,书中对匿名和具名函数在JScript与SpiderMonkey中的表现解释得不够清楚。好的,这篇文章就这个...

经验教程

792

收藏

41
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部