thisの関数呼び出しとメソッド呼び出し

CoffeeScriptとかJavaScript書く時、あるはずのプロパティが呼べなかったりして=>(fat arrow)とかvar that = this;とか使ってたんだけど使うタイミングが良くわかってなかった。

class Obj 
  constructor : (@prop)->

  method :() ->
    alert "1 : #{@prop}"
    @doCallback? ->
      alert "2 : #{@prop}"
    @doCallback? =>
      alert "3 : #{@prop}"

  doCallback : (callback) ->
    callback()


obj = new Obj "test"
# メソッド呼び出しなのでthisはobj自身を指す
# 1 : test
# 2 : undefined
# 3 : test
obj.method() 

# 関数呼び出しになるのでthisはグローバルを指す
func = obj.method
# 1 : undefined
# 2 : 実行されない
# 3 : 実行されない
func()

# apply
# 1 : test
# 2 : undefined
# 3 : test
func.apply obj

コールバックとかで無名関数を実行するときに、無名関数の中のthisはグローバルになる。