2013-12-14 14 views
10

JSの全く新しいので、これが覚えていない場合は容赦してください。なぜ "function(value){return my_function(value);}"をnode.jsのコールバックとして記述する必要がありますか?

string-> boolをマッピングする関数fを使って文字列のリストをフィルタリングしたいとします。これは動作します:

filteredList = list.filter(function(x) { return f(x); }) 

これは失敗します。

filteredList = list.filter(f) 

なぜ?

コード例:

~/projects/node (master)$ node 
> var items = ["node.js", "file.txt"] 
undefined 
> var regex = new RegExp('\\.js$') 
undefined 
> items.filter(regex.test) 
TypeError: Method RegExp.prototype.test called on incompatible receiver undefined 
    at test (native) 
    at Array.filter (native) 
    at repl:1:8 
    at REPLServer.self.eval (repl.js:110:21) 
    at Interface.<anonymous> (repl.js:239:12) 
    at Interface.EventEmitter.emit (events.js:95:17) 
    at Interface._onLine (readline.js:202:10) 
    at Interface._line (readline.js:531:8) 
    at Interface._ttyWrite (readline.js:760:14) 
    at ReadStream.onkeypress (readline.js:99:10) 
> items.filter(function(value) { return regex.test(value); }) 
[ 'node.js' ] 
> 
+1

「f」だけの場合は、違いはありません。関数をオブジェクトのメソッドとして呼び出す場合、関数が存在する可能性があります。 –

答えて

17

あなたは、「テスト」機能への参照を渡しているが、それが呼び出されたときに正規表現オブジェクトは、周りではありません。つまり、「テスト」の内部でthisの値はundefinedになります。

あなたはそれを避けることができます。

items.filter(regex.test.bind(regex)) 

.bind()メソッドは常にthisとして「正規表現」の値で実行されます関数を返します。

+1

パンチにもう一度勝つ! :) –

+0

ありがとう、@ Pointy!それはそれを明らかにする。 (そして@Scottも!=) – Juan

4

しばしばこれを行うことができない理由は、メソッドとして使用される関数が単なるメソッドではないということです。それらをメソッドとして呼び出さずに使用すると、元のコンテキストと離婚します。 Function.prototype.bind

items.filter(regex.test.bind(regex)); 
関連する問題