欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

在JavaScript中使用inline函数的问题_javascript技巧

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

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

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

在JavaScript中使用inline函数的问题_javascript技巧var foo = function()
在JavaScript中使用inline函数的问题_javascript技巧{
在JavaScript中使用inline函数的问题_javascript技巧
// TODO: . . .
在JavaScript中使用inline函数的问题_javascript技巧
return x;
在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧var foo = new Function('{/*todo*/return x;}');

后两种方法定义的JavaScript函数,在调用起来和第一种没有任何效果上的区别。

不过由于JavaScript是解释性语言,当我们定义一个函数的时候,解析引擎生成一个Function对象实例,然后把函数内容保存下来。所以每执行一次函数定义语句,就会生成一个函数。而不像编译语言,一个函数编译一次后就被任何语句调用。啊?难道JavaScript不能调用定义好的函数?不是这个意思了,当我们在制作JavaScript控件时,如果动态输出DHTML来作为控件的内容,就容易出现这样的问题。比如我们在一个HTML对象生成过程中,使用了inline方式定义的函数,那么这个元素生成几次,那个函数也就要同时生成几次。

在JavaScript中使用inline函数的问题_javascript技巧function TestObject.prototype.Render(doc, id)
在JavaScript中使用inline函数的问题_javascript技巧 {
在JavaScript中使用inline函数的问题_javascript技巧
var span = doc.createElement('SPAN');
在JavaScript中使用inline函数的问题_javascript技巧 span.Object
= this;
在JavaScript中使用inline函数的问题_javascript技巧
this.m_Element = span;
在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
if ( id == "NamedMethod" )
在JavaScript中使用inline函数的问题_javascript技巧 {
在JavaScript中使用inline函数的问题_javascript技巧 span.onclick
= asdf;
在JavaScript中使用inline函数的问题_javascript技巧 }
在JavaScript中使用inline函数的问题_javascript技巧
else
在JavaScript中使用inline函数的问题_javascript技巧 {
在JavaScript中使用inline函数的问题_javascript技巧 span.onclick
= function()
在JavaScript中使用inline函数的问题_javascript技巧 {
在JavaScript中使用inline函数的问题_javascript技巧
var asdf01 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf02 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf03 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf04 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf05 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf06 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf07 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf08 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf09 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf10 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf11 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf12 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧 };
在JavaScript中使用inline函数的问题_javascript技巧 }
在JavaScript中使用inline函数的问题_javascript技巧 span.Name
= this.m_Description;
在JavaScript中使用inline函数的问题_javascript技巧 span.innerText
= this.m_Name;
在JavaScript中使用inline函数的问题_javascript技巧 span.style.display
= 'block';
在JavaScript中使用inline函数的问题_javascript技巧
return span;
在JavaScript中使用inline函数的问题_javascript技巧 }

函数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时冗余数据就越多。

附测试代码:
在JavaScript中使用inline函数的问题_javascript技巧html>
在JavaScript中使用inline函数的问题_javascript技巧
head>
在JavaScript中使用inline函数的问题_javascript技巧
title>JScript Function Spendingtitle>
在JavaScript中使用inline函数的问题_javascript技巧
meta name="author" content="birdshome@博客园" />
在JavaScript中使用inline函数的问题_javascript技巧
head>
在JavaScript中使用inline函数的问题_javascript技巧
body onunload="ReleaseElements()">
在JavaScript中使用inline函数的问题_javascript技巧
button id="NamedMethod" onclick="GenerateObjects(this)">
在JavaScript中使用inline函数的问题_javascript技巧 Append Normal Elements
button>
在JavaScript中使用inline函数的问题_javascript技巧
button id="AnonymousMethod" onclick="GenerateObjects(this)">
在JavaScript中使用inline函数的问题_javascript技巧 Append Inline Elements
button>
在JavaScript中使用inline函数的问题_javascript技巧
div id="container">
在JavaScript中使用inline函数的问题_javascript技巧
div>
在JavaScript中使用inline函数的问题_javascript技巧
script language="Javascript">
在JavaScript中使用inline函数的问题_javascript技巧
function GenerateObjects(elmt)
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var room = document.getElementById('container');
在JavaScript中使用inline函数的问题_javascript技巧
for ( var i=0 ; i 1000 ; ++i )
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var obj = new TestObject('__Object__' + i);
在JavaScript中使用inline函数的问题_javascript技巧 room.appendChild(obj.Render(document, elmt.id));
在JavaScript中使用inline函数的问题_javascript技巧 }

在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
function TestObject(name)
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
this.m_Name = name;
在JavaScript中使用inline函数的问题_javascript技巧
this.m_Description = '';
在JavaScript中使用inline函数的问题_javascript技巧
this.m_Element = null;
在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
this.toString = function()
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
return '[class TestObject]';
在JavaScript中使用inline函数的问题_javascript技巧 }

在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
function TestObject.prototype.Render(doc, id)
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var span = doc.createElement('SPAN');
在JavaScript中使用inline函数的问题_javascript技巧 span.Object
= this;
在JavaScript中使用inline函数的问题_javascript技巧
this.m_Element = span;
在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
if ( id == "NamedMethod" )
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧 span.onclick
= asdf;
在JavaScript中使用inline函数的问题_javascript技巧 }

在JavaScript中使用inline函数的问题_javascript技巧
else
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧 span.onclick
= function()
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var asdf01 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf02 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf03 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf04 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf05 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf06 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf07 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf08 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf09 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf10 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf11 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf12 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧 }
;
在JavaScript中使用inline函数的问题_javascript技巧 }

在JavaScript中使用inline函数的问题_javascript技巧 span.Name
= this.m_Description;
在JavaScript中使用inline函数的问题_javascript技巧 span.innerText
= this.m_Name;
在JavaScript中使用inline函数的问题_javascript技巧 span.style.display
= 'block';
在JavaScript中使用inline函数的问题_javascript技巧
return span;
在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧
在JavaScript中使用inline函数的问题_javascript技巧
function asdf()
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var asdf01 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf02 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf03 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf04 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf05 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf06 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf07 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf08 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf09 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf10 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf11 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧
var asdf12 = ['a', 's', 'd', 'f'];
在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧
script>
在JavaScript中使用inline函数的问题_javascript技巧
script language="javascript">
在JavaScript中使用inline函数的问题_javascript技巧
function ReleaseElements()
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧
var room = document.getElementById('container');
在JavaScript中使用inline函数的问题_javascript技巧
var spans = room.all.tags('SPAN');
在JavaScript中使用inline函数的问题_javascript技巧
for ( var i=0 ; i spans.length ; ++i )
在JavaScript中使用inline函数的问题_javascript技巧
{
在JavaScript中使用inline函数的问题_javascript技巧 spans[i].Object
= '';
在JavaScript中使用inline函数的问题_javascript技巧 }

在JavaScript中使用inline函数的问题_javascript技巧}

在JavaScript中使用inline函数的问题_javascript技巧
script>
在JavaScript中使用inline函数的问题_javascript技巧
body>
在JavaScript中使用inline函数的问题_javascript技巧
html>
在JavaScript中使用inline函数的问题_javascript技巧