2006ǯ09·î23Æü 01:30 [Edit]
javascript - ¥Ú¡¼¥¸¤Ï¤¤¤ÄºÆÉÁ²è¤µ¤ì¤ë¤«
ÂçÊѤËÍÍѤʹͻ¡¤À¤¬¡¢°ì¤Ä½ÅÍפʻØÅ¦Ï³¤ì¤¬¤¢¤ë¡£
ITÀïµ - JavaScript ¤ò³Ø¤ÖºÝ¤Ë°ìÈÖ½ÅÍפʤΤˡ¢¸í²ò¤µ¤ì¤¬¤Á¤Ê setTimeout ·Ï¤Î³µÇ°setInterval¡¢setTimeout¡¢¥¤¥Ù¥ó¥È¤Ë¤è¤ë´Ø¿ô¤Î¼Â¹Ô¤òÍý²ò¤¹¤ë¤³¤È¤À¤È»×¤¦
¥Ú¡¼¥¸¤¬¤¤¤ÄºÆÉÁ²è¤µ¤ì¤ë¤«¡¢¤È¤¤¤¦¤³¤È¤Ç¤¢¤ë¡£
̤·Ð¸³¼Ô¤Ï¡¢document.write()¤äelement.innerHTML = "foo"¤Î¤è¤¦¤Ë¡¢¥Ö¥é¥¦¥¶¡¼¤Ë¡Ö½ñ¤½Ð¤·¤¿¡×ÅÀ¤Ç¤½¤ì¤¬Ä¾¤Á¤ËÈ¿±Ç¤µ¤ì¤ë¤È»×¤¦¤À¤í¤¦¡£
¤È¤³¤í¤¬¡¢¤½¤¦¤Ç¤Ï¤Ê¤¤¤Î¤Ç¤¢¤ë¡£
¼ÂÎã¤ò¸«¤Æ¤ß¤è¤¦¡£°Ê²¼¤Îscript¤ò¹Í¤¨¤Æ¤ß¤ë¡£¥Ü¥¿¥ó¤ò²¡¤¹¤È¡¢¥Ü¥¿¥ó¤Î¥é¥Ù¥ë¤¬1000¤«¤é1¤Þ¤Ç¥«¥¦¥ó¥È¥À¥¦¥ó¤·¤¿¸å¡¢¸µÄ̤ê¤Ë¤Ê¤ë¤³¤È¤ò°Õ¿Þ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¸«¤¨¤ë¡£
<script>
function bad_count(evt){
var self = evt.target || evt.srcElement;
for (var count = 1000; count > 0; count--){
self.value = count;
}
self.value="count";
}
</script>
<input type="submit" value="count" onclick="bad_count(event)">
¤È¤³¤í¤¬¡¢¤³¤Î¥Ü¥¿¥ó¤Ï´üÂÔÄÌ¤êÆ°¤«¤Ê¤¤¡£¥¯¥ê¥Ã¥¯¤·¤Æ¤â²¿¤âµ¯¤¤Ê¤¤¤è¤¦¤Ë¤·¤«¸«¤¨¤Ê¤¤¡£
¤½¤ì¤Ï¤Ê¤¼¤«?¤³¤³¤ËÈëÌ©¤¬¤¢¤ë¡£
´Ø¿ô¤Î¼Â¹ÔÃæ¤Ï¡¢¥Ú¡¼¥¸¤Î½ñ¤´¹¤¨¤Ïµ¯¤³¤é¤Ê¤¤¡£¤¹¤Ê¤ï¤Á¡¢´Ø¿ô¤Î¼Â¹Ô¥¥å¡¼¤¬¶õ¤Ë¤Ê¤Ã¤Æ»þÅÀ¤Ç¤Ï¤¸¤á¤Æ¥Ú¡¼¥¸¤Î½ñ¤´¹¤¨¤¬µ¯¤³¤ë¤Î¤À¡£¤À¤«¤é¾åµ¤ÎÎã¤Ç¤Ï¡¢ºÇ½ª¼Â¹Ô·ë²Ì¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤È¤¤¤¦¤ï¤±¤À¡£
¸½ºß¤Î¥Ö¥é¥¦¥¶¡¼¤Î¼ÂÁõ¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤è¤¦¤Ç¤¢¤ë¡£¡Ö¤è¤¦¤Ç¤¢¤ë¡×¤È¤¤¤¦¤Î¤Ï¡¢»ÅÍͽñ¤Ç³Îǧ¤·¤¿¤ï¤±¤Ç¤Ï¤Ê¤¤¤«¤é¤À¡£
¥¤¥Ù¥ó¥ÈȯÀ¸ ¢ª ´Ø¿ô¤Î¼Â¹Ô ¢ª ¥Ú¡¼¥¸¤ÎºÆÉÁ²è
¾åµ¤ÎÎã¤Ç°Õ¿Þ¤·¤¿¤è¤¦¤Ë¡¢¥«¥¦¥ó¥¿¡¼¤¬Æ°¤¤¤¿ÅÔÅÙɽ¼¨¤µ¤»¤¿¤¤¤È»×¤Ã¤¿¤é¡¢¤½¤ÎÅÔÅٴؿô¤Î¼Â¹Ô¤ò´°Î»¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£¤·¤«¤·¥«¥¦¥ó¥¿¡¼¤òư¤«¤¹¤È¤¤¤¦¹Ô°Ù¤½¤Î¤â¤Î¤Ë´Ø¿ô¤Î¼Â¹Ô¤¬É¬ÍפǤ¢¤ë¡£¤É¤¦¤·¤¿¤é¤è¤¤¤«?
¤½¤ÎÅú¤¨¤¬¡¢setTimeout()¤È¤¤¤¦¤ï¤±¤À¡£¾åµ¤ÎÎã¤Ç¤Ï¡¢¥«¥¦¥ó¥¿¡¼¤ò°ì¤Äư¤«¤·¤¿¤é¡¢¼¡¤Ë¥«¥¦¥ó¥¿¡¼¤òư¤«¤¹´Ø¿ô¤òsetTimeout()¤ÇÅÐÏ¿¤¹¤ë¡£¤¹¤ë¤È»ØÄê»þ´Ö°Ê¾å¸å¤Ë¤½¤Î´Ø¿ô¤ò¼Â¹Ô¤»¤è¤È¤¤¤¦¥¤¥Ù¥ó¥È¤¬È¯À¸¤·¡¢¤Þ¤¿¤½¤Î´Ø¿ô¤¬¼Â¹Ô¤µ¤ì¡¢¥Ú¡¼¥¸¤¬ºÆÉÁ²è¤µ¤ì¤ë¡£
¤½¤ì¤ò¼ÂºÝ¤Ë¤ä¤ë¤È¤É¤¦¤Ê¤ë¤«?°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡£
<script>
var count;
var timer;
function good_count(evt){
var self = evt.target || evt.srcElement;
count = 1000;
var callback = function(){
self.value = count--;
if (count > 0){
timer = setTimeout(callback, 0);
}else{
self.value = "count";
}
}
timer = setTimeout(callback, 0);
}
</script>
<input type="submit" value="count" onclick="good_count(event)">
º£Å٤ϤÁ¤ã¤ó¤Èư¤¯¡£¤Á¤ã¤ó¤Èư¤¯¤¬¡¢¤³¤Î¤ä¤ä¤³¤·¤µ¤Ï°ìÂβ¿¤À¤í¤¦¡£¤³¤¦¤·¤¿¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤ò»È¤Ã¤¿¥¤¥Ù¥ó¥È½èÍý¤È¤¤¤¦¤Î¤Ï¡¢GUI¥×¥í¥°¥é¥ß¥ó¥°¤ò·Ð¸³¤·¤¿¿Í¤Ç¤¢¤ì¤Ð¤¢¤ëÄøÅÙ´¶¿¨¤¬¤Ä¤«¤á¤ë¤È»×¤¦¤¬¡¢Ã༡Ū¤Ë½èÍý¤µ¤ì¤ë¥×¥í¥°¥é¥à¤·¤«½ñ¤¤¤¿¤³¤È¤¬¤Ê¤¤¿Í¤Ë¤Ï¡Ö¥Ï¥¡?¡×¤ÎÀ¤³¦¤À¤í¤¦¡£
¤·¤«¤·¤³¤Î¤ª¤«¤²¤Ç¡¢¥×¥í¥°¥é¥à¤ò¡Ö¼Â¹ÔÃæ¡×¤ËÃæÃǤ¹¤ë¤³¤È¤â²Äǽ¤Ë¤Ê¤ë¡£°Ê²¼¤Ï¥«¥¦¥ó¥¿¡¼¤¬Æ°¤¤¤Æ¤¤¤ë´Ö¤Ë¥Ü¥¿¥ó¤ò¥¯¥ê¥Ã¥¯¤¹¤ë¤È¥«¥¦¥ó¥È¤¬ÃæÃǤ¹¤ëÎã¤À¡£
function better_count(evt){
var self = evt.target || evt.srcElement;
if (timer){
timer = clearTimeout(timer); // clearTimeout(timer); timer = undefined;
return;
}
if (! count) count = 1000;
var callback = function(){
self.value = count--;
if (count > 0){
timer = setTimeout(callback, 10);
}else{
timer = clearTimeout(timer);
self.value = "count";
}
}
timer = setTimeout(callback, 10);
}
¤È¤Ï¤¤¤¨¡¢¤³¤Î¤ä¤êÊý¤Ï¶Ë¤á¤ÆÈóľ´¶Åª¤Ç¡¢¥Ð¥°¤Î²¹¾²¤È¤â¤Ê¤ê¤¦¤ë¡£ÆÃ¤Ë¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤ò½ñ¤¯»þ¤Ë¤Ï¡¢¡Ö½ªÎ»¡×½èÍý¤ò¤Á¤ã¤ó¤È¤ä¤é¤Ê¤¤¤È¼ó¤ò·¹¤²¤ë¥Ð¥°¤ÎȯÀ¸¸»¤È¤Ê¤ë¡£¾å¤ÎÎã¤Î¸å¤ÎclearTimeout()¤ò½ñ¤²Ã¤¨¤Æ¤ª¤«¤Ê¤¤¤È¡¢¡Ö¼Â¹Ô½ªÎ»¡×¸å¤ËÆóÅÙ¥¯¥ê¥Ã¥¯¤·¤Ê¤¤¤ÈºÆ¥«¥¦¥ó¥È¤·¤Ê¤¤±©Ìܤˤʤ롣
¼ÂºÝ¡¢Javascript¤Ë¤ª¤±¤ë¤³¤¦¤·¤¿½èÍý¤È¤¤¤¦¤Î¤Ï¡¢¤ä¤Ï¤êpreemptive multitasking¤Ê´Ä¶¤ÈÈæ³Ó¤¹¤ë¤ÈÀµÄ¾½ñ¤¤Å¤é¤¤¤È»×¤¦¡£¤ª¤«¤²¤ÇUnix¤Îsleep()ÄøÅ٤Τ³¤È¤Ç¤âÃηäò¹Ê¤é¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤ª¤Ã¤µ¤ó¤È¤·¤Æ¤Î°õ¾Ý¤Ç¤Ï¡¢OS X¤Ë¤Ê¤ëÁ°¤ÎSystem 7°Ê¹ß¤ÎMac OS¤Î´¶³Ð¤Ë»÷¤Æ¤¤¤ë¡£Åö»þ¤Ï¤½¤ì¤òcooporative multitasking¤È¸Æ¤ó¤Ç¤¿¤Ã¤±¡£¼«Á°¤Ç½èÍý¤òOS¤ËÊÖ¤µ¤Ê¤¤¤È¡¢¤¤¤Ä¤Þ¤Ç¤¿¤Ã¤Æ¤â»Ä¤ê¤Î¥×¥í¥°¥é¥à¤ÏÂÔ¤¿¤µ¤ì¤ë±©ÌܤˤʤëÅÀ¤Ë¤ª¤¤¤Æ¡¢¸½ºß¤Î¥Ö¥é¥¦¥¶¡¼¤Ë¤½¤Ã¤¯¤ê¤Ê¤Î¤À¡£
¥Ö¥é¥¦¥¶¡¼¤¬OS¤Ë¤Ê¤ë¤´»þÀ¤¤Ç¤¢¤ë¡£¤³¤ì¤é¤âpreemptive¤Ë¤Ê¤Ã¤ÆÍߤ·¤¤¤È»×¤¦¤Î¤Ï»ä¤À¤±¤À¤í¤¦¤«¡£¾¯¤Ê¤¯¤È¤â¡¢Unix¤Îfflush()Ū¤Ê¤â¤Î¤ÏÍߤ·¤¤¡£´Ø¿ô¤ÎÃæ¤Ç¤â¤½¤ì¤ò¸Æ¤Ö¤È¶¯À©Åª¤Ë¥Ú¡¼¥¸ºÆÉÁ²è¤µ¤ì¤ë¤è¤¦¤Ê´Ø¿ô¤¬¡£window.refresh()¡£¤È¤«¡£
Dan the Javascripter
¤³¤Îµ»ö¤Ø¤Î¥È¥é¥Ã¥¯¥Ð¥Ã¥¯URL
<pre>
<script>
Function.prototype.bind = function(obj) {
var __method = this;
return function() {
return __method.call(obj);
}
}
var count = 99;
function good_count() {
if (--count > 0) {
this.value = count;
}
else {
clearInterval(timer);
this.value = 'count';
}
}
</script>
<input type="submit" value="count" onclick="timer = setInterval(good_count.bind(this), 10);">
</pre>
[javascript] JavaScript 1.7 ¤Î yield ¤¬À¨¤¹¤®¤ë·ï¤Ë¤Ä¤¤¤Æ
http://d.hatena.ne.jp/amachang/20060805
¤Þ¤¢¤³¤ÎÊդϸÀ¸ì»ÅÍͤȤ¤¤¦¤è¤ê¤Ï¥¤¥ó¥¿¥×¥ê¥¿¤Î¼ÂÁõ¦¤¬¤ó¤Ð¤ì¤è¡¢¤È¤¤¤¦ÏäʤΤ«¤â¤·¤ì¤Ê¤¤¤±¤É¡£
window.refresh()¤ÏÍߤ·¤¤¤Ç¤¹¤Í¡£
¤Ç¤â¤³¤ì¤¤¤ÄÌá¤Ã¤Æ¤¯¤ë¤«ÊݾڤǤ¤Ê¤¤¤Î¤Ç¼ÂÁõ¤¬¿É¤½¤¦¡©¤È¤â»×¤¤¤Þ¤·¤¿¡£