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

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

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

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

Q&A

1回答

1316閲覧

クロージャの実行結果

imamoto_browser

総合スコア1161

JavaScript

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

0グッド

0クリップ

投稿2015/05/11 13:07

http://qiita.com/5t111111/items/9a8bdac862820910131fの解説で、

function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}

function testList() {
var fnlist = buildList([1,2,3]);
for (var j = 0; j < fnlist.length; j++) {
fnlistj;
}
}

の結果が"item3 undefined" と3回表示ですが、item変数を参照しているタイミングはreturn resultされた後という認識でよろしいのでしょうか。そうであれば、item1,item2,・・とalertさせたいときは、無名関数は使えないということでしょうか。

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

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

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

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

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

guest

回答1

0

そうですね、参照しているタイミングはreturn resultされた後、testList()内でfnlistj;と無名関数が実行されたタイミングになります。

ですから無名関数が呼ばれた時点で変数itemには"item3"、iはループを抜けたあとなので3が入っていることになります。またlist[3]は配列の範囲外なのでundefinedになります。
結果、3回とも"item3 undefined"とアラートされるわけですね。

itemやiが変更されるのを防ぐには、無名関数を使って状態を保持しておくという手があります

lang

1function buildList(list) { 2 var result = []; 3 for (var i = 0; i < list.length; i++) { 4 var item = 'item' + list[i]; 5 (function (item, i) { 6 result.push( function() {alert(item + ' ' + list[i])} ); 7 })(item, i); 8 } 9 return result; 10}

JavaScriptクロージャ入門でも言われている通りクロージャは関数呼び出し毎に生成なので、
無名関数内のitem, iは呼び出し元のitem, iが変化しても変わることはありません。

投稿2015/05/11 15:26

MAGP

総合スコア153

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問