gist

2012年6月18日月曜日

CoffeeScriptで学ぶ Underscore.js 09(Function編)

ようやくFunction編です。Underscore.jsの要です。


bind

_.bind(function, object, [*arguments])

bindは、関数をオブジェクトにバインドして返します。関数が呼ばれると、第2引数objectが関数の中のthisの値となります。必要に応じて予め引数を記述して関数にバインドします。これは関数型言語でいうところの部分適用(部分パラメータ化)として知られています。

_ = require 'underscore'

func = (greeting)->
 greeting + ', ' + this.name

func = _.bind func, {name:'moe'}, 'hi'

console.log func()
実行結果
$ coffee bind.coffee 
hi, moe

bindAll

_.bindAll(object, [*methodNames])

第1引数のobjectにある複数の関数をすべてバインドしてオブジェクトを返します。第2引数で、バインドする関数を絞ることもできます。よくイベントハンドラで使われています。コンポーネントを作りたいとき便利です。

_ = require 'underscore'

buttonView = 
 label: 'underscore'
 onClick : ()->
  console.log 'onClick: ' + this.label
 onHover : ()->
  console.log 'onHover: ' + this.label

_.bindAll(buttonView)

buttonView.onClick()

実行結果
$ coffee bindAll.coffee 
onClick: underscore

memoize

_.memoize(function, [hashFunction])

memoizeは、計算結果を得ることにより得られた関数を返します。よく計算が遅い場合に処理を高速化するのに利用されます。関数型言語の記述に似せています。

_ = require 'underscore'

fibonacci = _.memoize (n)->
 return n if n < 2
 return fibonacci(n-1) + fibonacci(n-2)

console.log fibonacci(10);

実行結果
$ coffee memoize.coffee 
55

delay

_.delay(function, wait, [*arguments])

delayは、setTimeout関数によく似ています。waitで指定したミリ秒後に関数functionを実行します。

_ = require 'underscore'

log = _.bind console.log, console

_.delay log, 1000, '1秒後のログ'
実行結果
$ coffee delay.coffee 
1秒後のログ

実行後、1秒後にログが表示されます。


defer

_.defer(function, [*arguments])

deferは、現在のコールスタックが空になるまでに関数を実行します。UIスレッドをブロックしないで、重い処理を走らす場合などに使います。

_ = require 'underscore'

_.defer ()->
 num for num in [0..1000]
 console.log num

console.log 'こっちが先'
実行結果
$ coffee defer.coffee 
こっちが先
1001

関連ページ

0 件のコメント: