在JavaScript中使用inline函数的问题
前段时间被IE和JavaScript脚本引擎的Memory Leak问题弄得郁闷坏了,不过幸好现在总算是柳暗花明了,并且找到了一些IE中使用脚本避免ML问题的方法。继续研究JavaScript的编写,有发现一些不算ML问题,但是可以节约IE内存使用的方法,在此和大家讨论讨论。
我们在JavaScript中编写代码,对于定义函数的语句:
{
// TODO: . . .
return x;
}
可以说是在熟悉不过了。当然除了这种定义函数的方法,我们还有另外几种方法也能定义函数:
{
// TODO: . . .
return x;
}
后两种方法定义的JavaScript函数,在调用起来和第一种没有任何效果上的区别。
不过由于JavaScript是解释性语言,当我们定义一个函数的时候,解析引擎生成一个Function对象实例,然后把函数内容保存下来。所以每执行一次函数定义语句,就会生成一个函数。而不像编译语言,一个函数编译一次后就被任何语句调用。啊?难道JavaScript不能调用定义好的函数?不是这个意思了,当我们在制作JavaScript控件时,如果动态输出DHTML来作为控件的内容,就容易出现这样的问题。比如我们在一个HTML对象生成过程中,使用了inline方式定义的函数,那么这个元素生成几次,那个函数也就要同时生成几次。
{
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;
}
函数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时冗余数据就越多。
附测试代码:
<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>
转载于:https://www.cnblogs.com/birdshome/archive/2005/03/03/107134.html
在JavaScript中使用inline函数的问题相关推荐
- JavaScript中的工厂函数vs构造函数vs class
原文链接:JavaScript Factory Functions vs Constructor Functions vs Classes 作者:Eric Elliott 译者:sunny 转载需提前 ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- 关于javascript中的回调函数
关于javascript中的回调函数 原文地址:http://blog.csdn.net/sicluoyi/article/details/1737969 考虑一个这样的例子: 假如某个项目的底层和高 ...
- 深入认识javascript中的eval函数
来源:http://wanyij.blog.51cto.com/46570/43794 发现为本文起一个合适的标题还不是那么容易,呵呵,所以在此先说明下本文的两个目的: (1)介绍javascript ...
- matlab里inline定义矩阵,Matlab中的inline函数_matlab中inline函数
Matlab中的inline函数 1.有时为了描述某个数学函数的方便,可以用inline()函数来直接编写该函数,形式相当于M-函数,但无编写一个真正的MATLAB文件,就可以描述出某种数学关系.其调 ...
- JavaScript中语句与函数的执行辨析
文章出自个人博客https://knightyun.github.io/2018/05/23/js-anonymous-function,转载请申明. Javascript代码中,语句和函数以及匿名函 ...
- 如何找到JavaScript中的调用者函数?
function main() {Hello(); }function Hello() {// How do you find out the caller function is 'main'? } ...
- jQuery中的read 和JavaScript中 的onload函数的区别
2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript中,onload函数是最经常用到的,这个函数的作用是等待网页完全加载之后再去执行代码块中的语句,因为按照 ...
- 在javascript中使用纯函数处理副作用
在javascript中使用纯函数处理副作用 今天给大家带来一片译文, 详情请点击这里.可能在墙内哦 开始了, 如果你点开这篇文章, 就证明你已经开始涉及函数式编程了, 这距离你知道纯函数的概念不会很 ...
最新文章
- 某程序员揭秘“开水团”大厂真实福利:工位拥挤,没有食堂!公司防员工跟防贼一样,特别是纸巾和插排都粘到桌子上!...
- Linux系统日志切割
- 华 为 路 由 器 命 令 大 全
- python服务器搭建 实战_实战讲解:如何用Python搭建一个服务器
- aws spark_使用Spark构建AWS数据湖时的一些问题以及如何处理这些问题
- 请问C#中如何自动生成summary注释
- 境外WiFi市场持续升温 2016年或迎普及元年
- C语言——指针函数和函数指针(回调函数)
- java虚拟机内存存储一个对象_java虚拟机在java堆中对象内存分配、布局、访问
- ISO9000和CMM
- 【AAAI 2021】全部接受论文列表(四)
- 块截断编码图像压缩技术
- 面试过阿里等互联网大公司,我知道了这些套路
- mysql 性能优化方案
- 利用JavaFX实现风险中性下股票价格的二叉树模型
- python图书馆管理系统实验报告_基于python图书馆管理系统设计实例详解
- 我CSDN博客被黑经历
- linux卸载命令pkg,[转]软件包管理的命令:pkginfo、pkgadd和pkgrm
- zookeeper隐藏通道
- 好程序员web前端分享移动前端开发和web前端开发的区别