在JavaScript中使用inline函數(shù)的問題
我們在JavaScript中編寫代碼,對于定義函數(shù)的語句:
function foo()
{
// TODO: . . .
return x;
}可以說是在熟悉不過了。當(dāng)然除了這種定義函數(shù)的方法,我們還有另外幾種方法也能定義函數(shù):
var foo = function()
{
// TODO: . . .
return x;
}
var foo = new Function('{/*todo*/return x;}'); 后兩種方法定義的JavaScript函數(shù),在調(diào)用起來和第一種沒有任何效果上的區(qū)別。
不過由于JavaScript是解釋性語言,當(dāng)我們定義一個函數(shù)的時候,解析引擎生成一個Function對象實例,然后把函數(shù)內(nèi)容保存下來。所以每執(zhí)行一次函數(shù)定義語句,就會生成一個函數(shù)。而不像編譯語言,一個函數(shù)編譯一次后就被任何語句調(diào)用。???難道JavaScript不能調(diào)用定義好的函數(shù)?不是這個意思了,當(dāng)我們在制作JavaScript控件時,如果動態(tài)輸出DHTML來作為控件的內(nèi)容,就容易出現(xiàn)這樣的問題。比如我們在一個HTML對象生成過程中,使用了inline方式定義的函數(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)容是用來占位置的,這樣inline方式定義函數(shù),每次Render()都就會生成一個新的函數(shù)對象。使用inline方式有什么不好呢?當(dāng)對象實例多了的時候,會很明顯的浪費內(nèi)存空間呀,試驗數(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)
單看絕對內(nèi)存消耗差別不大,可是如果看相對內(nèi)存消耗:(35.2-33.4)/(33.4-27.4) = 30% !!!,還是很可觀的了,而且如果方法本省越大,inline時冗余數(shù)據(jù)就越多。
附測試代碼:
<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)文章
JavaScript null和undefined區(qū)別分析
在JavaScript開發(fā)中,被人問到:null與undefined到底有啥區(qū)別?2009-10-10
JavaScript實現(xiàn)將數(shù)組中所有元素連接成一個字符串的方法
這篇文章主要介紹了JavaScript實現(xiàn)將數(shù)組中所有元素連接成一個字符串的方法,涉及javascript中采用join方法進行數(shù)組轉(zhuǎn)化的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
JavaScript中三個等號和兩個等號的區(qū)別(== 和 ===)淺析
javascript中比較運算符'=='與'==='可能大家用的比較多,但是大家對他的區(qū)別不是很清楚,接下來小編給大家介紹下js中三個等號和兩個等號的區(qū)別(== 和 ===),感興趣的朋友可以參考下2016-09-09

