js変な質問
先日javaeyeで1篇の招待状を见ました:【JS最適化シリーズ】一つのタイマーの書き方からjsの多様な実現方式の優劣を検討する、ビルの主人が确かにすごいと感じて、1つのタイマーはそんなに优雅な书き方があって、その上すべて対象に向かう思想で、私は丸1日かけてあれらの书き方をすべて消化して、あれらの残した評論を见て、javaeyeの上で确かに人材が辈出していることを発见して、道理で先輩がcsdnからjavaeyeにブログを移したわけだ.ここで私が発見した奇妙な問題を貼って、牛が私の困惑を解くことができることを望んでいます.
投稿の「コード6」は次のとおりです.
function Timer(id){
this.id = id;
this.timer = null;
this.count = 0;
}
Timer.prototype = {
begin : function(count){
this.count = count;
this.show(this)();// Timer.show(this)();
this.timer = setInterval(this.show(this),1000);// Timer.show(this)();
},
show : function(obj){
return function(){
if(obj.count < 0){
document.getElementById(obj.id).innerHTML = "over";
clearInterval(obj.timer);
return ;
}
document.getElementById(obj.id).innerHTML = obj.count;
obj.count--;
}
}
}
このコードには何の問題もなく、実行結果はすべて正常ですが、「Timer.prototype={」という行と後の行をTimerコンストラクション関数の内部に移動すると、firebugの下に「t 1.begin is not a function」というエラーが表示されます.
<body>
<div id="time1">time1</div>
<div id="time2">time2</div>
</body>
<script>
function Timer(id){
this.id = id;
this.timer = null;
this.count = 0;
Timer.prototype = {
begin : function(count){
//alert(this);
this.count = count;
this.show(this)();// Timer.show(this)();
this.timer = setInterval(this.show(this),1000);// Timer.show(this)();
},
show : function(obj){
return function(){
if(obj.count < 0){
document.getElementById(obj.id).innerHTML = "over";
clearInterval(obj.timer);
return ;
}
document.getElementById(obj.id).innerHTML = obj.count;
obj.count--;
}
}
};
}
t1 = new Timer("time1");
t2 = new Timer("time2");
t1.begin(10);
t2.begin(10);
</script>
そして、「コード7」を見ると、すべてTimerを使っています.prototype.ベンとティマーprototype.ショーは中に書いても実行できます.
function Timer(id){
this.id = id;
this.timer = null;
this.count = 0;
Timer.prototype.begin = function(count){
this.count = count;
this.show(this)();// Timer.show(this)();
this.timer = setInterval(this.show(this),1000);// Timer.show(this)();
}
Timer.prototype.show = function(obj){
return function(){
if(obj.count < 0){
document.getElementById(obj.id).innerHTML = "over";
clearInterval(obj.timer);
return ;
}
document.getElementById(obj.id).innerHTML = obj.count;
obj.count--;
}
}
}
どうしてこんなに変なのか分からないが、私の帖がレンガを投げて玉を引く効果を果たすことを望んでいる.大牛たちの素晴らしい解答を期待します!