function addEvent(obj,type,fn){ var saved = null; if(obj[type] != null){ saved = obj[type]; } obj[type] = function(){ if(saved)saved(); fn.call(this); } } function toBlue(){ this.className = 'blue'; alert('blue'); addEvent(this,'onclick',toRed); //将代码换成下面这行,则不能弹出hello,world //this.onclick = toRed; //原因是这个onclick会覆盖之前的onclick事件,saved中(递归调用了本身的代码)保存了所有之前发生过的click //颜色的变化会产生幻觉,以为只执行了一次切换颜 色,不一定是一次,而是所有onclick的次数 //addEvent方法就是将所有的click执行一遍, } this.className = 'red'; alert('red'); addEvent(this,'onclick',toBlue); } window.onload = function(){ var box = document.getElementById('box'); addEvent(box,'onclick',function(){ alert('hello,world!'); }); addEvent(box,'onclick',toBlue); }