[阅读: 799] 2008-04-08 01:22:14
<script type="text/javascript">
function Hello(name){this.name = name;}
Hello.prototype.Start = function(){setTimeout(function(me){return function(){me.Show()}}(this), 5000);};
Hello.prototype.Show = function(){alert(this.name);}
var BillGates = new Hello("Bill Gates");
var SteveJobs = new Hello("Steve Jobs");
BillGates.Start();
SteveJobs.Start();
</script>
setTimeout和setInterval的第一个参数既可以传函数对象也可以传字符串,如果传字符串实际上也是相当于构造了一个匿名函数。
要让某个代码记住某个数据,并不留下痕迹的话,就是将该代码和该数据形成一个闭包。也就是把该代码写成函数内的一个函数,而该数据作为外层函数参数,这些数据又被内部函数引用了。当内部函数被当作返回值出来时,外层函数脱壳之后就消失了,而返回的函数还引用着原来的代码并间接引用着原来的数据,这就形成了闭包。
但在内层函数中,不能使用this,外层函数的那个this并没有隐含传递给内层函数,内层函数的this实际是window对象。因此,要给通过一个明确定义的参数来传this,比如me。
直接setTimeout(this.Show, 8000)呢,这个只是把this.Show函数体给了setTimeout,setTimeout又不会帮你记住this。所以,当时间条件触发时,执行引擎仅仅是调用Show(),而不是this.Show(),这时this是window对象,window对象确实有个name属性,但默认是“”, 而不是undefined。
累死我了,一大早来回这么个长贴。
施主,化俺一顿斋饭吧。
李战(leadzen)