2012/01/26

Array.prototype.slice.callとcallとapply


あるJavaScriptライブラリのコードを読んでいたらArray.prototype.slice.call(argments)という部分があった。
良く見かけるんだけど、なんだったか忘れてしまうのでメモ。

引数を格納している変数argments。
どんな関数にもある。
引数が複数ある場合は、argmentsの中身も複数になる
で、lengthは取れるんだけど、配列のメソッドは持っていないらしい。
var args = Array.prototype.slice.call(arguments);
これで引数が格納された配列が出来上がる


で、この時使われているcallというメソッドはなに?
これはすべての関数が持っている関数。
関数1.call(引数1, [引数2, 引数3]);
この引数1には関数1の中で使われるthisとして使いたいオブジェクト渡す。
上記の
Array.prototype.slice.call(arguments);
で言うと、Arrayが持ってるsliceメソッドの中で使われているthisは、引数で渡すargumentsってことにしちゃいますってこと。
slice(start, [end])はthisの中の0から数えて、start 番目~ end - 1 番目までの要素を抜き出した配列を返すメソッド。
なのでこの中のthisをargumentsにすり替えた場合、argumentsの中のstart 番目~ end - 1 番目までの要素を抜き出した配列を返してくれる。
startもendも指定しない場合は中身全部ってことになるので、argumentsの要素を全部抜き出した配列が返ってくることになる。

callに関して、すごくわかりやすく説明してくれている方がいたのでそっちを見て
applyとcallの使い方を丁寧に説明してみる


ついでにapplyもメモ
基本的にはcalllと同じ機能。
違うのは第2引数以降をカンマ区切りにするんじゃなくて配列で渡すとこ


参考:
argumentsとArray.prototype.slice.call : JavaScript
applyとcallの使い方を丁寧に説明してみる

0 件のコメント:

コメントを投稿