(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

JavaScriptのapply呼び出し

この前、Underscore.jsについて書いた。

このときzip関数を紹介していて、それの機能のひとつとしてzip.applyを紹介してしまった。
これ実はapply呼び出しという、JavaScriptの機能だということを知らなかった。。

table_data = [["a", 1], ["b", 2], ["c", 3]]
console.log table_data
#[["a", 1], ["b", 2], ["c", 3]]
console.log _.zip.apply(_, table_data)
#[["a", "b", "c"], [1, 2, 3]]

applyの第一引数は関数内で参照するthisを渡すことができる。

hoge = ->
  this.foo + ", " + this.bar

console.log hoge.apply {foo: "foo!", bar: "bar!!"}
#foo!, bar!!

で、第二引数として、その関数が必要とする引数の配列を受け取ることができる。
つまり、zip.applyを呼び出した時の実行結果が前述の通りになるのは自明だったというわけです。

table_data = [["a", 1], ["b", 2], ["c", 3]]

#これは
console.log _.zip.apply(_, table_data)

#これと同義
console.log _.zip(["a", 1], ["b", 2], ["c", 3])

JavaScript奥が深いです。