dポイントプレゼントキャンペーン実施中!

Array.prototype.forEach.call()とは何でしょうか?

arrayは配列のことですよね。

prototypeについては
https://developer.mozilla.org/ja/JavaScript/Refe …
に説明があり、

forEachについては
https://developer.mozilla.org/ja/JavaScript/Refe …
に説明があり、

callについては
http://www.scollabo.com/banban/jsindex/sample/sa …
に説明がありましたが、何が何だかさっぱりです。

また、Array.prototype.forEach.call()の場合は
「array」+「prototype」+「forEach」+「call」
それぞれの説明を混ぜたものということになるのでしょうか。

<dd>を押すと”書き変えました”というテキストに書き変えるコードを書いてみました。
理解できてないので動きません。
アドバイスを頂けないでしょうか。

<html lang="ja">
<head>
<script type="text/javascript">
function click() {
var element = node.ownerDocument;
var qsA = element.querySelectorAll ('#sample > dd');
Array.prototype.forEach.call (qsA, function () {qsA.nodeText = "書き変えました"});
}
</script>
</head>
<body>
<dl id="sample">
 <dt>サンプル1</dt>
 <dd onclick="click()">11111</dd>
 <dt>サンプル2</dt>
 <dd onclick="click()">22222</dd>
</dl>
</body>
</html>

A 回答 (2件)

> <dd onclick="click()">の部分を<dd onclick="click(event)">に変更し


> 実行しましたが書き換えられませんでした。

あ~、のうないいんたーぷりんたのせいのうがわるくて、もうしわけない。
function click () { ~
かんすうめいがわるい。Alick とか Blick とか Click とかてきとうにかえてください。


いろいろとこむずかしい、しらべたせつめいをならべられても、よくわかりません!(まじ。)


> (3)~
> というようにできますか?

つくってうごかしてみればいいのでは?
そうやってながれをりかいするほうがよいとおもいます。
(わたしはいまもそうですが、そういうときはいまだに alert をつかいまくります。)


document は、ぐろーばるですが、 いべんとがおきた「もとの document」 と、おなじとはかぎらない。
    • good
    • 0

それって、わたしがかいたから?


・・・。


かんすうに、とくていのパラメータをわたすには、ひきすうとしてわたすほうほうと、
function hoge (arg0, arg1, arg2) {
 alert (arg0);
 alert (arg1);
 alert (arg2);
}

hoge (1,2,3);



this をりようするほうほうがあります。
function hoge () {
 alert (this.arg0);
 alert (this.arg1);
 alert (this.arg2);
}

var p = { arg0: 1, arg1: 2, arg2: 3 };
hoge.call (p);



forEach をりようするならば、
function hoge (n) {
 alert (n);
}
var ary = [1,2,3];
ary.forEach (hoge);


うえの ary は、はいれつ (Array) ですが、

var ary2 = document.querySelectorAll ('#sample > dd');

この ary2 は、はいれつのようで はいれつではなく、
「(いきていない)のーどりすと」です
はいれつではないので、forEach をつかえないのです。
ではどうするか?


ちょっとごかいがあるかもしれませんが、おそれずにたとえると
Array オブジェクトに prototype でつなげてある forEach かんすうそのものを
よびだしてつかえばよいのです。

よびだすには、ary2 を、this にしてつかうので
Array.prototype.forEach.call (ary2, hoge);

こうすることで、ary2 にある ddようそ1つ1つにたいして、かんすう hoge の
だい1ひきすうとしてよびだし、じっこうすることができるようになるのです。

もしこの hoge に、さらなるあたいをぱらめーたとしてわたしたいばあいは、
それにも this をつかいます

var p = { arg0: 1, arg1: 2, arg2: 3 };
Array.prototype.forEach.call (ary2, hoge, p);



--
いべんとしょりのだい1ひきすうは、event ときまっているそうです
<dd onclick="click()">11111</dd>
ではなく、
<dd onclick="click(event)">11111</dd>
と、しましょうか。

function click (event) {
 var dd = event.target; // dd = element
 dd.textContent = '書き変えました';
}


--

もし、dd ようそすべてをかきかえたいなら
function click (event) {
 var dd = event.target;
 var doc = dd.ownerDocument;
 var dds = doc.querySelectorAll ('#sample > dd');
 
 Array.prototype.forEach.call (dds, function (e) {
  e.textContent = '書き変えました';
 });
}
    • good
    • 0
この回答へのお礼

function click (event) {
var dd = event.target; //(1)
var doc = dd.ownerDocument; //(2)
var dds = doc.querySelectorAll ('#sample > dd');

Array.prototype.forEach.call (dds, function (e) { //(3)
e.textContent = '書き変えました';
});
}
<dd onclick="click()">の部分を<dd onclick="click(event)">に変更し
実行しましたが書き換えられませんでした。

(1)var dd = event.target;
調べると「targetプロパティはイベントが発生したWindowオブジェクト、Documentオブジェクト、HTMLElementオブジェクトへの参照」。つまり、自分が作成したオブジェクト以外に標準でオブジェクトが用意されていて、そのプログラムを使って何かの処理を自動的にしてくれる。targetプロパティを使わない場合に標準のオブジェクトを参照するには、document.getElementById("dd")ですか???

(2)「ownerDocument プロパティは、ノードが含まれるトップレベルのドキュメントオブジェクトを返す」ということのようです。
ドキュメントオブジェクトは、ページに関するあらゆる情報がオブジェクトとしてまとめられていて、それを利用することができる。
ノードは、DOM側で見たときの全ての要素の呼び方。
html側で見たときの<p>はPタグと呼び、DOM側ではそれを要素ノードと呼ぶ。
ノードが含まれるトップレベルのドキュメントオブジェクトとは…<html>タグのこと。
もしdocument.getElementById("dd")を使った場合はownerDocumentは不要。
つまり、ownerDocumentは簡単にいろいろ使える便利なものということ。
ですか???

(3) Array.prototype.forEach.callに直接関数を書かずに、
var func = function (e) {e.textContent = '書き変えました';};
Array.prototype.forEach.call (dds, func);
というようにできますか?
また、
「もしこの hoge に、さらなるあたいをぱらめーたとしてわたしたいばあいは、
それにも this をつかいます」という部分ですが、
Array.prototype.forEach.call (ary2, hoge, p);
つまり
Array.prototype.forEach.call (this, 関数, this);
さらにhoge(関数)に対してパラメータを複数追加したいときは
Array.prototype.forEach.call (this, 関数, this, this, …);
とするということでしょうか。

お礼日時:2011/11/14 02:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!