(编辑:jimmy 日期: 2025/10/31 浏览:2)
 function foo()
function foo() {
{ // TODO: . . .
    // TODO: . . . return x;
    return x; }
}
可以说是在熟悉不过了。当然除了这种定义函数的方法,我们还有另外几种方法也能定义函数:
 var foo = function()
var foo = function() {
{ // TODO: . . .
    // TODO: . . . return x;
    return x; }
} var foo = new 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)
 function TestObject.prototype.Render(doc, id) {
 { var span = doc.createElement('SPAN');
    var span = doc.createElement('SPAN'); span.Object = this;
    span.Object = this; this.m_Element = span;
    this.m_Element = span;
 if ( id == "NamedMethod" )
    if ( id == "NamedMethod" ) {
    { span.onclick = asdf;
        span.onclick = asdf; }
    } else
    else {
    {  span.onclick = function()
        span.onclick = function() {
        { var asdf01 = ['a', 's', 'd', 'f'];
            var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f'];
            var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f'];
            var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f'];
            var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f'];
            var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f'];
            var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f'];
            var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f'];
            var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f'];
            var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f'];
            var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f'];
            var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f'];
            var asdf12 = ['a', 's', 'd', 'f']; };
        }; }
    } span.Name = this.m_Description;
    span.Name = this.m_Description; span.innerText = this.m_Name;
    span.innerText = this.m_Name; span.style.display = 'block';
    span.style.display = 'block'; return span;
    return span; }
 }
函数span.onclick = function()中的内容是用来占位置的,这样inline方式定义函数,每次Render()都就会生成一个新的函数对象。使用inline方式有什么不好呢?当对象实例多了的时候,会很明显的浪费内存空间呀,试验数据如下:
 <html>
<html> <head>
<head> <title>JScript Function Spending</title>
    <title>JScript Function Spending</title> <meta name="author" content="birdshome@博客园" />
    <meta name="author" content="birdshome@博客园" />  </head>
</head> <body onunload="ReleaseElements()">
<body onunload="ReleaseElements()"> <button id="NamedMethod" onclick="GenerateObjects(this)">
    <button id="NamedMethod" onclick="GenerateObjects(this)"> Append Normal Elements</button>
        Append Normal Elements</button> <button id="AnonymousMethod" onclick="GenerateObjects(this)">
    <button id="AnonymousMethod" onclick="GenerateObjects(this)"> Append Inline Elements</button>
        Append Inline Elements</button> <div id="container">
    <div id="container"> </div>
    </div>
 <script language="Javascript">
    <script language="Javascript">
 function GenerateObjects(elmt)
function GenerateObjects(elmt)

 {
{ var room = document.getElementById('container');
    var room = document.getElementById('container'); for ( var i=0 ; i < 1000 ; ++i )
    for ( var i=0 ; i < 1000 ; ++i )
 
     {
{ var obj = new TestObject('__Object__' + i);
         var obj = new TestObject('__Object__' + i); room.appendChild(obj.Render(document, elmt.id));
         room.appendChild(obj.Render(document, elmt.id)); }
    }  }
}
 function TestObject(name)
function TestObject(name)

 {
{ this.m_Name = name;
    this.m_Name = name; this.m_Description = '';
    this.m_Description = ''; this.m_Element = null;
    this.m_Element = null; 
          this.toString = function()
    this.toString = function()
 
     {
{ return '[class TestObject]';
         return '[class TestObject]';  }
    } }
}
 function TestObject.prototype.Render(doc, id)
function TestObject.prototype.Render(doc, id)

 {
{ var span = doc.createElement('SPAN');
    var span = doc.createElement('SPAN'); span.Object = this;
    span.Object = this; this.m_Element = span;
    this.m_Element = span;
 if ( id == "NamedMethod" )
    if ( id == "NamedMethod" )
 
     {
{ span.onclick = asdf;
         span.onclick = asdf; }
    } else
    else
 
     {
{  span.onclick = function()
         span.onclick = function()
 
          {
{ var asdf01 = ['a', 's', 'd', 'f'];
             var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f'];
             var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f'];
             var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f'];
             var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f'];
             var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f'];
             var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f'];
             var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f'];
             var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f'];
             var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f'];
             var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f'];
             var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f'];
             var asdf12 = ['a', 's', 'd', 'f']; };
         }; }
    } span.Name = this.m_Description;
    span.Name = this.m_Description; span.innerText = this.m_Name;
    span.innerText = this.m_Name; span.style.display = 'block';
    span.style.display = 'block'; return span;
    return span; }
}
 function asdf()
function asdf()

 {
{ var asdf01 = ['a', 's', 'd', 'f'];
    var asdf01 = ['a', 's', 'd', 'f']; var asdf02 = ['a', 's', 'd', 'f'];
    var asdf02 = ['a', 's', 'd', 'f']; var asdf03 = ['a', 's', 'd', 'f'];
    var asdf03 = ['a', 's', 'd', 'f']; var asdf04 = ['a', 's', 'd', 'f'];
    var asdf04 = ['a', 's', 'd', 'f']; var asdf05 = ['a', 's', 'd', 'f'];
    var asdf05 = ['a', 's', 'd', 'f']; var asdf06 = ['a', 's', 'd', 'f'];
    var asdf06 = ['a', 's', 'd', 'f']; var asdf07 = ['a', 's', 'd', 'f'];
    var asdf07 = ['a', 's', 'd', 'f']; var asdf08 = ['a', 's', 'd', 'f'];
    var asdf08 = ['a', 's', 'd', 'f']; var asdf09 = ['a', 's', 'd', 'f'];
    var asdf09 = ['a', 's', 'd', 'f']; var asdf10 = ['a', 's', 'd', 'f'];
    var asdf10 = ['a', 's', 'd', 'f']; var asdf11 = ['a', 's', 'd', 'f'];
    var asdf11 = ['a', 's', 'd', 'f']; var asdf12 = ['a', 's', 'd', 'f'];
    var asdf12 = ['a', 's', 'd', 'f']; }
} </script>
</script>
 <script language="javascript">
    <script language="javascript">
 function ReleaseElements()
function ReleaseElements()

 {
{ var room = document.getElementById('container');
    var room = document.getElementById('container'); var spans = room.all.tags('SPAN');
    var spans = room.all.tags('SPAN'); for ( var i=0 ; i < spans.length ; ++i )
    for ( var i=0 ; i < spans.length ; ++i )
 
     {
{ spans[i].Object = '';
         spans[i].Object = ''; }
    } }
}  </script>
</script> </body>
</body> </html>
</html>