中国开发网: 论坛: .NET/C#: 贴子 618357
李战
施主真有耐心啊,解答如下:
<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)

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录