Math.max.apply(this, [4, 7, 2, 1]); // 7
こんな感じのコードをみて最初何してるの?と思いました。
適当に WEB で調べてみると arguments がキーになりそう。
function foo() {
return arguments;
}
foo.apply(this, [1, 5, 3]); // [1, 5, 3]
foo.call(this, [1, 5, 3]); // [[1, 5, 3]]
foo.call(this, 1, 5, 3); // [1, 5, 3]
call で呼び出した場合は、可変長に渡した引数が arguments として正しく理解されています。
動的に引数が変化するものを許可する関数(今回でいえば Math.max)を作成したい場合には、 arguments から引数をとり、 apply で呼び出すようにコーディングすればいいのかな。
call は引数が静的なため処理、特に無名関数を利用した軽いインターフェースに利用しそう。(呼ばれる)
function foo(func) {
func.call(this, "Hello!");
}
foo(function(message) {
window.alert(message);
}
apply はユーティリティ的な関数。(呼ぶ)
call と apply の使い方(呼ばれる、呼ぶ)は自分の勝手なイメージです。
何はともあれ少しだけ理解が深まりました。