欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在JavaScript中使用inline函數(shù)的問(wèn)題

 更新時(shí)間:2007年03月08日 00:00:00   作者:  
前段時(shí)間被IE和JavaScript腳本引擎的Memory Leak問(wèn)題弄得郁悶壞了,不過(guò)幸好現(xiàn)在總算是柳暗花明了,并且找到了一些IE中使用腳本避免ML問(wèn)題的方法。繼續(xù)研究JavaScript的編寫,有發(fā)現(xiàn)一些不算ML問(wèn)題,但是可以節(jié)約IE內(nèi)存使用的方法,在此和大家討論討論。

    我們?cè)贘avaScript中編寫代碼,對(duì)于定義函數(shù)的語(yǔ)句:
function foo()
{
    
// TODO: . . .
    return x;
}

可以說(shuō)是在熟悉不過(guò)了。當(dāng)然除了這種定義函數(shù)的方法,我們還有另外幾種方法也能定義函數(shù):

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

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

    后兩種方法定義的JavaScript函數(shù),在調(diào)用起來(lái)和第一種沒有任何效果上的區(qū)別。

    不過(guò)由于JavaScript是解釋性語(yǔ)言,當(dāng)我們定義一個(gè)函數(shù)的時(shí)候,解析引擎生成一個(gè)Function對(duì)象實(shí)例,然后把函數(shù)內(nèi)容保存下來(lái)。所以每執(zhí)行一次函數(shù)定義語(yǔ)句,就會(huì)生成一個(gè)函數(shù)。而不像編譯語(yǔ)言,一個(gè)函數(shù)編譯一次后就被任何語(yǔ)句調(diào)用。啊?難道JavaScript不能調(diào)用定義好的函數(shù)?不是這個(gè)意思了,當(dāng)我們?cè)谥谱鱆avaScript控件時(shí),如果動(dòng)態(tài)輸出DHTML來(lái)作為控件的內(nèi)容,就容易出現(xiàn)這樣的問(wèn)題。比如我們?cè)谝粋€(gè)HTML對(duì)象生成過(guò)程中,使用了inline方式定義的函數(shù),那么這個(gè)元素生成幾次,那個(gè)函數(shù)也就要同時(shí)生成幾次。

 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;
 }

    函數(shù)span.onclick = function()中的內(nèi)容是用來(lái)占位置的,這樣inline方式定義函數(shù),每次Render()都就會(huì)生成一個(gè)新的函數(shù)對(duì)象。使用inline方式有什么不好呢?當(dāng)對(duì)象實(shí)例多了的時(shí)候,會(huì)很明顯的浪費(fèi)內(nèi)存空間呀,試驗(yàn)數(shù)據(jù)如下:

   
 Normal Method   Inline Method 
 Initialized  27.4 M 27.4 M
 Rendered  33.4 M 35.2 M

    // IE消耗的內(nèi)存數(shù)量(PM+VM)

    單看絕對(duì)內(nèi)存消耗差別不大,可是如果看相對(duì)內(nèi)存消耗:(35.2-33.4)/(33.4-27.4) = 30% !!!,還是很可觀的了,而且如果方法本省越大,inline時(shí)冗余數(shù)據(jù)就越多。

    附測(cè)試代碼:
<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>

相關(guān)文章

  • 簡(jiǎn)單的分頁(yè)代碼js實(shí)現(xiàn)

    簡(jiǎn)單的分頁(yè)代碼js實(shí)現(xiàn)

    簡(jiǎn)單的分頁(yè)代碼js實(shí)現(xiàn),分享給大家,感興趣的小伙伴們可以參考一下
    2016-05-05
  • JS判斷一個(gè)數(shù)是否是水仙花數(shù)

    JS判斷一個(gè)數(shù)是否是水仙花數(shù)

    水仙花數(shù)是指一個(gè) n 位數(shù) ( n≥3 ),它的每個(gè)位上的數(shù)字的 n 次冪之和等于它本身。下面通過(guò)本文給大家分享JS判斷一個(gè)數(shù)是否是水仙花數(shù),需要的朋友參考下吧
    2017-06-06
  • JavaScript實(shí)現(xiàn)瀑布流布局的代碼分享

    JavaScript實(shí)現(xiàn)瀑布流布局的代碼分享

    不知道大家在線上購(gòu)物的時(shí)候有沒有發(fā)現(xiàn)到,自己逛起來(lái)根本就停不下來(lái),越往下翻越是覺得就會(huì)出現(xiàn)需要的東西,這就是很多電商公司都在使用的瀑布流布局。本文就來(lái)用JS實(shí)現(xiàn)這一布局,需要的可以參考一下
    2023-04-04
  • 深入理解 TypeScript Reflect Metadata

    深入理解 TypeScript Reflect Metadata

    這篇文章主要介紹了深入理解 TypeScript Reflect Metadata,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Bootstrap組件之下拉菜單,多級(jí)菜單及按鈕布局方法實(shí)例

    Bootstrap組件之下拉菜單,多級(jí)菜單及按鈕布局方法實(shí)例

    這篇文章主要介紹了Bootstrap組件之下拉菜單,多級(jí)菜單及按鈕布局方法,結(jié)合完整實(shí)例形式分析了Bootstrap多級(jí)菜單布局相關(guān)樣式功能與具體使用技巧,需要的朋友可以參考下
    2017-05-05
  • js實(shí)現(xiàn)的點(diǎn)擊數(shù)量加一可操作數(shù)據(jù)庫(kù)

    js實(shí)現(xiàn)的點(diǎn)擊數(shù)量加一可操作數(shù)據(jù)庫(kù)

    這篇文章主要介紹了js如何實(shí)現(xiàn)的點(diǎn)擊數(shù)量加一操作數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2014-05-05
  • Echarts圖表中formatter的基本用法示例

    Echarts圖表中formatter的基本用法示例

    formatter 提示框浮層內(nèi)容格式器,支持字符串模板和回調(diào)函數(shù)兩種形式,下面這篇文章主要給大家介紹了關(guān)于Echarts圖表中formatter的基本用法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • HTML的select控件美化

    HTML的select控件美化

    本文主要介紹了HTML的select控件美化以及js實(shí)現(xiàn)select選擇功能的方法步驟。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 如何用javascript去掉字符串里的所有空格

    如何用javascript去掉字符串里的所有空格

    如何用javascript去掉字符串里的所有空格...
    2007-02-02
  • 基于canvas的二維碼邀請(qǐng)函生成插件

    基于canvas的二維碼邀請(qǐng)函生成插件

    本文主要介紹了基于canvas的二維碼邀請(qǐng)函生成插件。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論