天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

在JavaScript中使用inline函數的問題

前段時間被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 M27.4 M
 Rendered  33.4 M35.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>

JavaScript技術在JavaScript中使用inline函數的問題,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 在线天天看片视频免费观看 | 青春草久久 | 国产99九九久久无码熟妇 | 日韩成人性视频 | 少妇内射兰兰久久 | 欧美ZC0O人与善交的最新章节 | 日韩精品无码免费专区 | 我半夜摸妺妺的奶C了她软件 | 国内精品乱码卡一卡2卡三卡 | 久久内在线视频精品mp4 | 久久午夜免费视频 | 黑人干亚洲人 | 国产成人在线视频观看 | 色欲人妻无码AV精品一区二区 | 亚洲免费在线播放 | 亚洲AV久久久噜噜噜久久 | 亚洲精品一线二线三线无人区 | 久久天堂成人影院 | 精品亚洲欧美中文字幕在线看 | 公交车被CAO到合不拢腿 | 毛片网站在线观看 | 中国女人内谢69xxxxxx直播 | 最近更新2019中文字幕国语 | 蜜柚免费视频高清观看在线 | 日韩内射美女人妻一区二区三区 | 俄罗斯一级毛片aaaa | 最近韩国日本免费观看mv免费版 | 四虎精品久久 | 久久无码AV亚洲精品色午夜 | 午夜片无码区在线观看 | 超碰97人人做人人爱网站 | 开心片色99xxxx | 国产精品一区二区20P | 青草在线观看视频 | 午夜伦理电影在线观免费 | 在线播放无码字幕亚洲 | 精品无码无人网站免费视频 | metart中国撒尿人体欣赏 | 伊人久久中文字幕久久cm | videos gratis欧美另类 | 男男高H啪肉Np文多攻多一受 |