论坛首页 Web前端技术论坛

【JS优化系列】从一个计时器的写法探讨js多种实现方式的优劣

浏览 15707 次
精华帖 (7) :: 良好帖 (5) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-23   最后修改:2009-09-23
clone168 写道

放在Timer构造函数内部的话:

 

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--;    
            }    
        }    
    };  
}  

 

 很奇怪,不知道什么原因

 

其实只要把例子构造得稍微复杂点的例子,就很容易理解这个问题了

 

function Timer(id){    
    this.id = id;    
    this.timer = null;    
    this.count = 0;
	this.begin=function(count){
alert('this:'+id);  
            this.count = count;    
            this.show(this)();//注意这里不是Timer.show(this)();    
            this.timer = setInterval(this.show(this),1000);//注意这里不是Timer.show(this)();    
	}

    Timer.prototype = {
	id:"abcd",
        begin : function(count){    
alert('prototype');  
            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--;    
            }    
        }    
    };  
}

new Timer('aaa').begin(10);
0 请登录后投票
   发表时间:2009-10-03  
我也回个
function Timer(count,id) {
	var start=count,obj=document.getElementById(id);
	do {
		(function (count) {
			setTimeout(function () {
				obj.innerHTML=count;
			},(start-count)*1000);
		})(count);
	} while (count--);
}

一个函数,不做构造了,直接调用就执行
Timer(10,"oDiv");
0 请登录后投票
   发表时间:2009-10-05  
我也回个
function Timer(count,id) {  
    var start=count,obj=document.getElementById(id);  
    do {  
        (function (count) {  
            setTimeout(function () {  
                obj.innerHTML=count;  
            },(start-count)*1000);  
        })(count);  
    } while (count--);  
} 



一个函数,不做构造了,直接调用就执行
Js代码
Timer(10,"oDiv");
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics