Почему мне нужно написать "function (value) {return my_function (value);}" в качестве обратного вызова в node.js?

совершенно новый для JS, поэтому, пожалуйста, простите, если это ошеломительно очевидно.

Предположим, что я хочу отфильтровать список строк с помощью функции f, которая отображает строку → bool. Это работает:

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

Вы передаете ссылку на функцию "test", но когда она вызывается, объект регулярных выражений не будет вокруг. Другими словами, внутри "теста" значение this будет undefined.

Вы можете избежать этого:

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

Метод .bind() возвращает функцию, которая всегда будет выполняться со значением "regex" как this.

Ответ 2

Причина, по которой вы часто не можете этого сделать, состоит в том, что функции, используемые в качестве методов, - это не просто методы. Если вы используете их, не ссылаясь на них как методы, они затем оторваны от их исходного контекста. Вы можете обойти это с помощью Function.prototype.bind:

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