在JavaScript中使用inline函数的问题


Posted in Javascript onMarch 08, 2007

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

    我们在JavaScript中编写代码,对于定义函数的语句:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在JavaScript中使用inline函数的问题}
 
在JavaScript中使用inline函数的问题
</script>
在JavaScript中使用inline函数的问题
</body>
在JavaScript中使用inline函数的问题
</html>
在JavaScript中使用inline函数的问题

Javascript 相关文章推荐
JavaScript代码复用模式实例分析
Dec 02 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
javascript继承机制实例详解
Nov 20 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
js+div+css下拉导航菜单完整代码分享
Dec 28 Javascript
angularJS开发注意事项
May 26 Javascript
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
使用async await 封装 axios的方法
Jul 09 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
Sep 04 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 Javascript
JS类中定义原型方法的两种实现的区别
Mar 08 #Javascript
JavaScript语言中的Literal Syntax特性分析
Mar 08 #Javascript
从JavaScript的函数重名看其初始化方式
Mar 08 #Javascript
翻译整理的jQuery使用查询手册
Mar 07 #Javascript
用window.location.href实现刷新另个框架页面
Mar 07 #Javascript
javascript中的location用法简单介绍
Mar 07 #Javascript
JsEasy简介 JsEasy是什么?与下载
Mar 07 #Javascript
You might like
str_replace只替换一次字符串的方法
2013/04/09 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
python递归计算N!的方法
2015/05/05 Python
对python的文件内注释 help注释方法
2018/05/23 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
python实现五子棋游戏
2019/06/18 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
django框架使用方法详解
2019/07/18 Python
浙江文明网签名寄语
2014/01/18 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
开工仪式主持词
2014/03/20 职场文书
给公司的建议书范文
2014/05/13 职场文书
领导欢迎词范文
2015/01/26 职场文书
个性与发展自我评价
2015/03/06 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python