源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 374|回复: 21

[JavaScript] 在JavaScript中使用inline函数的问题

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2007-3-8 00:00:00 | 显示全部楼层 |阅读模式
前段时间被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.Object = '';
    }

</script>
</body>
</html>

回复

使用道具 举报

1

主题

2万

回帖

155

积分

注册会员

Rank: 2

积分
155
发表于 2022-8-12 13:16:06 | 显示全部楼层
女生看了弄丢了卡萨诺的卡洛斯
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-9-8 15:02:50 | 显示全部楼层
不错的源码论坛
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-10-4 00:46:11 | 显示全部楼层
啪啪啪生怕PSP怕
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2022-10-21 10:24:48 | 显示全部楼层
看看看咋么
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

163

积分

注册会员

Rank: 2

积分
163
发表于 2023-1-9 15:39:08 | 显示全部楼层
vcxvcxv
TS人妖演出表演服务q3268336102电话13168842816
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-2-7 15:08:35 | 显示全部楼层
呵呵呵呵呵呵
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

55

积分

注册会员

Rank: 2

积分
55
发表于 2023-3-11 01:35:58 | 显示全部楼层
vcxvcxv
回复 支持 反对

使用道具 举报

1

主题

1万

回帖

93

积分

注册会员

Rank: 2

积分
93
发表于 2023-4-1 12:34:04 | 显示全部楼层
看到这帖子真是高兴!
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-5-10 12:51:52 | 显示全部楼层
呵呵呵呵呵呵
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-22 09:19 , Processed in 0.342772 second(s), 45 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表