Использование модуля Underscore с Node.js

Я изучал node.js и модули и не могу заставить библиотеку Underscore работать правильно... кажется, что в первый раз, когда я использую функцию из Underscore, она перезаписывает _ объект с результатом моего вызова функции. Кто-нибудь знает, что происходит? Например, вот сеанс из node.js REPL:

Admin-MacBook-Pro:test admin$ node
> require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _.max([1,2,3])
3
> _.max([4,5,6])
TypeError: Object 3 has no method 'max'
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:171:22)
    at Interface.emit (events.js:64:17)
    at Interface._onLine (readline.js:153:10)
    at Interface._line (readline.js:408:8)
    at Interface._ttyWrite (readline.js:585:14)
    at ReadStream.<anonymous> (readline.js:73:12)
    at ReadStream.emit (events.js:81:20)
    at ReadStream._emitKey (tty_posix.js:307:10)
    at ReadStream.onData (tty_posix.js:70:12)
> _
3

Когда я сам создаю файлы Javascript и импортирую их, они, похоже, работают правильно. Может быть, что-то особенное в библиотеке подделок?

Ответ 1

Node REPL использует переменную подчеркивания, чтобы удерживать результат последней операции, поэтому она конфликтует с использованием библиотеки Underscore той же переменной. Попробуйте что-то вроде этого:

Admin-MacBook-Pro:test admin$ node
> _und = require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _und.max([1,2,3])
3
> _und.max([4,5,6])
6

Ответ 2

На сегодняшний день (30 апреля 2012 года) вы можете использовать Underscore, как обычно, в вашем Node.js-коде. Предыдущие комментарии правы указывают, что интерфейс REPL (Node режим командной строки) использует "_" для хранения последнего результата, но вы можете использовать его в своих файлах кода, и он будет работать без проблем, выполнив стандарт:

var _ = require('underscore');

Счастливое кодирование!

Ответ 3

Или:

    var _ = require('underscore')._;

Ответ 4

Имя _, используемое node.js REPL для хранения предыдущего ввода. Выберите другое имя.

Ответ 5

Примечание. Следующее работает только для следующей строки кода и только из-за совпадения.

С помощью Lodash,

require('lodash');
_.isArray([]); // true

Нет var _ = require('lodash'), так как Lodash загадочно устанавливает это значение глобально, когда требуется.