素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

1秒ごとに一ずつ増えた値を出力する方法と、変数の束縛について

iが0〜10の間、一秒後ごとにiをconsoleに出力する、っていうのをしたい場合。
普通に、

var i=0;
var tid=setInterval(
function(){
console.log(i++)
i>=10 && clearInterval(tid);
}
,1000)

ってすると、初めに出力されるのが実行したときから1秒後になってしまう。

ということで、こうすれば初めに出力されるのは実行してすぐで、次から1秒ごとにできる。

var i=0;
(function(){
console.log(i++);
i<10&&setTimeout(arguments.callee,1000);
})()

無名関数内でしか使わないのに、外からiが参照できるのは気持ちが悪い気がしてきた。

これについては、クロージャを使って

(function(){
var i=0;
(function(){

console.log(i++);
i<10&&setTimeout(arguments.callee,10);
})()
})()

とするか、with文を使って

with({i:0}){
(function(){
console.log(i++);
i<10&&setTimeout(arguments.callee,10);
})()
}

とするか、JavaScript1.7のlet文を使って

let(i=0){
(function(){
console.log(i++);
i<10&&setTimeout(arguments.callee,10);
})()
}

とすればいいけど、あまり気にしないほうがいいと思う。