質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1681閲覧

for と for ... of で let を用いた時の動作の違いについて

Lhankor_Mhy

総合スコア36104

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

1クリップ

投稿2016/10/21 04:02

javascript

1var target = [1,2,3] 2for (let value of target) { 3 window.setTimeout(function(){ 4 console.log(value); 5 },1000) 6}; 7for (let i=0; i<target.length; i++) { 8 window.setTimeout(function(){ 9 console.log(target[i]); 10 },1000) 11}; 12 13//想定してた出力結果 14//1 15//2 16//3 17//1 18//2 19//3 20//実際の出力結果 21//3 22//3 23//3 24//1 25//2 26//3

何故このような違いが出るのかを教えてください。

think49, Y.H.👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

【Create a new fiddle - JSFiddle】
https://jsfiddle.net/bmyjpLma/

Firefoxでは質問文と同じような問題が起き、Choromeなら起きませんでした。


ちなみに下記コードもFirefoxではシンタックスエラーを起こします。英語版のほうにこれについてはバグとして上がっているようです。(ver.51でフィックス)

JavaScript

1let iterable = [10, 20, 30]; 2for (const value of iterable) { 3 console.log(value); 4}

【for...of - JavaScript | MDN】
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#Browser_compatibility

Prior Firefox 51, using the for...of loop construct with the const keyword threw a SyntaxError ("missing = in const declaration"). This has been fixed (bug 1101653).

投稿2016/10/21 05:31

編集2016/10/21 06:10
kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2016/10/21 06:00

それと同様のバグなら = の有無に左右されるかな、と思って for (let i; (i=i||0)<target.length; i++) { とかやってみましたが、そんな単純な話ではなかったですねw やっぱりバグかなあ? 仕様としてはChromeの結果が正しいんですよね?
maisumakun

2016/10/21 06:02

JavaScriptなら書けると知ってはいても、「アクセント記号付きの変数名」というのにはやはり否定的に反応してしまいます。
kei344

2016/10/21 06:09 編集

To: Lhankor_Mhy 仕様としてはChromeの結果が正しいと思います。 To: maisumakunさん 「MDNの記述を変えることなく書いてエラー」という例なのでご容赦いただければ・・・。 ↑訂正、書いていませんでした。修正します。
Lhankor_Mhy

2016/10/21 06:37

フランスのプログラマはアクセント符号付けたコード書くんですね……
think49

2016/10/21 12:36

ブロックスコープ全般がダメかと思いきやfor-of限定で再現するんですね…。 (回避する方法はあるので実害は大きくなさそう) https://jsfiddle.net/0wdmh5uy/
guest

0

javascript

1for (let value of target) { 2 window.setTimeout(function(){ 3 console.log(value); 4 },1000) 5};

単純に、1秒待っている間にvalueへの取り出しがtargetの最後まで進んでいるからではないでしょうか

javascript

1for (let value of target) { 2 console.log(value); 3};

これなら確実に 1, 2, 3 と出力されると思います

投稿2016/10/21 04:24

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2016/10/21 04:37

だとすると、後半のforでも同じことが起こるはずですよねえ……
takito

2016/10/21 04:41

・・・ですよね コメント出してからそう思いました・・・
takito

2016/10/21 09:26 編集

コードをそのままコピペしてChromeで実行してみたら、うまいこと 1 2 3 1 2 3 と出ました 違いはなんでしょうね・・・ (なんか当たり前のことを書いてたのでここ消します・・・頭がウニだ・・・)
Lhankor_Mhy

2016/10/21 05:16

あれ?環境依存? 当方firefoxでしたが、Chromeで確認してみます。
Lhankor_Mhy

2016/10/21 05:19

Chromeで123123と出ました。うわー、Firefoxのバグの可能性が出てきましたね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問