【解決済み】forEachの使い方が間違っているでしょうか?

月宮りお
記事: 23
登録日時: 2016年9月09日(金) 16:30

【解決済み】forEachの使い方が間違っているでしょうか?

投稿記事by 月宮りお » 2016年12月24日(土) 18:46

いつもお世話になっていますm( )m

「計略」というタイプのスキルを作っています。パーティー内に
「軍師」がいる場合、アクター自身が習得しているスキルだけでなく
軍師が習得しているスキルを全員が使うことができる
(威力の大小はともかく)という仕組みを作ろうとしています。

Window_SkillList.prototype.makeItemList

↑スキルウィンドウに含めるスキルの一覧を作っているこの部分で、
最終的にthis._dataの中にスキル一覧をまとめていることが分かったため、
試にその最後に、

this._data.push($dataSkills[5]);

と書き加えてみたところ、パーティ全員のスキルウィンドウに5番のスキルが
追加され、選ぶと問題なく使用することもできました。

次に"5"のところに軍師が習得しているスキルの番号を順に入れて行けばよいと
思ったのですが、エラー(添付画像)が出て上手くいかなかったため、
一歩戻って以下のように試してみました。

var kari = [5,6,7];
kari.forEach(function(number){
this._data.push($dataSkills[number]);
});

↑これでも同様のエラーが出てしまいました。forEachの使い方の間違いで
numberに、一週目に5、二週目に6、三週目に7がちゃんと入っていないのかな?
と思って、一行上にconsole.logをはさんでみました。

var kari = [5,6,7];
kari.forEach(function(number){
console.log(number);
this._data.push($dataSkills[number]);
});

↑これで試したところ、numberにはちゃんと5と6と7がそれぞれ
入っていました。

ここで途方に暮れています。this._data.push($dataSkills[5]);
とすればちゃんと5番のスキルが追加されたのに、forEachで
5番、6番、7番のスキルを追加しようとするとエラーが出る、
というのはどんな理由が考えられるでしょうか?
添付ファイル
sample.jpg
sample.jpg (6.47 KiB) 閲覧数: 3700 回
最後に編集したユーザー 月宮りお on 2016年12月24日(土) 22:36 [ 編集 1 回目 ]

アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: forEachの使い方が間違っているでしょうか?

投稿記事by まっつUP » 2016年12月24日(土) 20:33

月宮りお様
お世話になります。

良く分かりませんがforEach内では
エラー内容に出ている通りthis._dataがundefinedになるようです。
良く分かりませんが(2回目)
this._actorが真のときに以下を実行したらいったぽいので載せておきます。

var kari = [8,9,10];
var kari2 = this._data;
kari.forEach(function(number){
//ここでthis._dataがundefinedになる。
kari2.push($dataSkills[number]);
})
this._data = kari2;
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: forEachの使い方が間違っているでしょうか?

投稿記事by 奏ねこま » 2016年12月24日(土) 21:37

forEach文に渡したコールバック関数(function(number){~)の中で「this」が指す先は、
forEachを実行したオブジェクトではなくグローバルオブジェクトです。
コールバック関数の中のthisが指す先をforEachを実行したオブジェクトにしたいなら、

コード: 全て選択

kari.forEach(function(number){
this._data.push($dataSkills[number]);
}, this);

こうしてください(三行目に注目)。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: forEachの使い方が間違っているでしょうか?

投稿記事by まっつUP » 2016年12月24日(土) 22:03

何かおかしいと思ったら最後にthisがついてなかったんですね。
失礼しました。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
月宮りお
記事: 23
登録日時: 2016年9月09日(金) 16:30

Re: forEachの使い方が間違っているでしょうか?

投稿記事by 月宮りお » 2016年12月24日(土) 22:35

お二方ご回答ありがとうございますm( )m

やはり書き方が間違っていたのですね>_<
外側と内側でthisの中身が違っているとは
思いもしませんでした。

お陰様で無事に意図通りの挙動にできました。
ありがとうございますm( )m

“MV:質問” へ戻る