1 <script type="text/javascript"> 2 //单例模式 3 4 //1,每次点击都会生成一个新的div 5 var createMask=function () { 6 return document.body.appendChild(document.createElement(div)); 7 } 8 $("button").click(function(){ 9 var mask=createMask(); 10 mask.show(); 11 }); 12 13 //2,有可能这个mask会永远也用不上 14 var mask=document.body.appendChild(document.createMask("div")); 15 $("button").click(function(){ 16 mask.show(); 17 }); 18 19 //3,1)函数体内改变了变量mask的引用,在多人协作的项目中,createMask是个不安全的函数。2)另一方面,mask这个全局变量不是非需不可。 20 var mask; 21 var createMask=function(){ 22 if(mask){ 23 return mask; 24 } 25 else{ 26 mask=document.body.appendChild(document.createElement(div)); 27 return mask; 28 } 29 }; 30 //4,用闭包的形式,只生成一个mask 31 var createMask=function(){ 32 var mask; 33 return function(){ 34 return mask||(mask=document.body.appendChild(document.createElement(div))); 35 }; 36 }() 37 //5,最终版本 38 var singleton=function(fn){ 39 var result; 40 return function(){ 41 return result||(result=fn.apply(this,arguments)); 42 } 43 } 44 var createMask=singleton(function(){ 45 return document.body.appendChild(document.createElement("div")); 46 }); 47 用一个变量来保存第一次的返回值,如果它已经被赋过值,那么在以后的调用中,优先返回该值, 48 </script>