関数オブジェクトとMethod/UnboundMethodオブジェクト

foo = new Object();
foo.hoge = function () {print(this)};

fuga = foo.hoge
piyo = function () {foo.hoge()};

fuga.call(foo)
piyo()

このfugaとpiyoは違うんだよね.JavaScript的には当然なんだろうけど.ただの関数オブジェクトだから.
どっちかというとpiyoのほうがよく使いそうだから,functionとか書かずに使えても良さそうな気がしないでもない.
この二つは,Rubyで言うと丁度MethodオブジェクトとUnboundMethodオブジェクトに相当する.

class Foo
  def hoge
    p(self)
  end
end

foo = Foo.new
fuga = Foo.instance_method(:hoge)
piyo = foo.method(:hoge)

fuga.bind(foo)[]
piyo[]

UnboundMethodオブジェクトはbindしないと使えないから,JavaScriptみたいにcallで呼ぶのを忘れて変なことが起きないようになってるのは安心だね.
でも,instance_methodはちょっと長い.