2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

var と let でfor文の中で違い

Posted at

ブロックスコープだとか、関数スコープとかで、言うけど、なんとなく一緒だと思ってたけど、明確にふるまいが違うのが、発生した。

qiita.js
for(let i = 0 ; i < 10 ; i++){
console.log(i);
}

qiita.js
for(var i = 0 ; i < 10 ; i++){
console.log(i);
}

は同じ。
1,2,3,4,5,6,7,8,9

これは、その時点でconsoleが発動されるので納得できる。
1ミリ秒でも後に実行されるもので確認してみる

qiita.js
for(let i = 0 ; i < 10 ; i++){
setTimeout(()=>console.log(i),1)
}

は同じ。
1,2,3,4,5,6,7,8,9

qiita.js
for(var i = 0 ; i < 10 ; i++){
setTimeout(()=>console.log(i),1)
}

は違う
10,10,10,10,10,10,10,10,10,10
これは、for文が終わった後に呼ばれるので、10になってる。

jQueryで、例えば、

qiita.js
for(var i = 0 ; i < 10 ; i++){
$(".btn").eq(i).click(()=>{
//i番目がクリックされた事にしたいとしても
function(i);
})
}

ってしても、どれをクリックしてもfunction(10)が発動してしまう

qiita.js
for(let i = 0 ; i < 10 ; i++){
$(".btn").eq(i).click(()=>{
//i番目がクリックされた事にしたいとしても
function(i);
})
}

ってすると、n番目をクリックしたらfunction(n)が発動する。

letの方が、自分としてもイメージ通りの動作をして、varがバグっぽい動作に感じるので、constやletを面倒でvarばっか使っていたのを、改善しなくちゃって思いました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?