JS实现模拟多线程,本文使用到js的闭包特性(2)
正当我信心满满的想查看结果时,发现出错。查找了一些资料,大概明白是由于setInterval执行时,传进来的形参已经脱离了其定义的函数环境,已经被垃圾回收器回收了。
由于时间紧迫,来不及细查资料,暂时采取了一种其他的方法来实现:每个节点对应一个函数。
代码如下:见index2.html
<HTML>
<HEAD>
<TITLE> 实例2 </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function Node(id,name,cn){
this.id = id;
this.name = name;
this.cn = cn;
}
var nodes = new Array();
nodes[0] = new Node(1,"node1","节点1");
nodes[1] = new Node(2,"node2","节点2");
var nodeConfig = {};
nodeConfig.ticks = 4 * 1000; //刷新频率
nodeConfig.msg = "运行中

function showStatus1(node){
alert(node.name + ":" + nodeConfig.msg);
}
function showStatus2(node){
alert(node.name + ":" + nodeConfig.msg);
}
function start(){
setInterval(function(){showStatus1(nodes[0])} ,nodeConfig.ticks);
setInterval(function(){showStatus2(nodes[1])} ,nodeConfig.ticks);
}
start();
//-->
</SCRIPT>
</BODY>
</HTML>
此段代码能够执行,但是其缺陷显而易见:每当增加一个节点时,就要手动的去改代码,增加函数。而这些代码大部分都是相同的,虽然可以直接Copy,维护难度却会一直增加,一不小心就不知道是哪个节点更改错了。
稍微闲下来时,继续查找资料,终于找了闭包的概念。关于闭包的介绍,此处只是简单概述,具体的可以看下面的参考资料,那里面介绍的很详细。
所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。(引自参考文章)
我自己的理解就是:外部变量保存了某个内部函数的指针,由于JS垃圾回收机制,也间接的保存了内部函数定义环境的一些变量。