在Node.js中使用Underscore模块


147

我一直在学习有关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文件并将其导入时,它们似乎工作正常。Underscore库也许有一些特别之处?

Answers:


169

Node REPL使用underscore变量保存上一次操作的结果,因此它与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
谢谢。那很简单。
Geoff

6
现在,我已经在键盘上敲打头部30分钟了,谢谢!
rossipedia 2013年

3
这就是SO很棒的原因。这样的好答案可以节省数小时的“撞头”。Thankyou @Mike
Brian Tracy

节点v6 支持_在REPL中进行分配
John-David Dalton

194

截至今天(2012年4月30日),您可以照常在Node.js代码上使用Underscore。前面的评论正确指出REPL接口(Node的命令行模式)使用“ _”来保存最后的结果,但您可以在代码文件上自由使用它,并且通过执行该标准可以正常工作:

var _ = require('underscore');

编码愉快!


7
请注意,如果您尝试全球化下划线,则此方法将无效:gist.github.com/3220108
Lance Pollard

9
曾经有人告诉我,Globals在所有开发语言上都是不好的。我看不到必须在需要它的模块上指定var _ = require('underscore')的问题。nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

2012年4月30日对应于哪个Node版本?
–poseid

2012年4月对应于0.6。
Erick Ruiz de Chavez

Erick,如果您也尝试在服务器端重用客户端代码,那就是一个问题。
布兰登



-3

注意:以下内容仅适用于下一行代码,并且仅出于巧合。

有了Lodash,

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

var _ = require('lodash')由于Lodash在需要时会全局设置此值,因此不会。


不,这不适用于lodash或其他功能。它在您的示例中有效,因为如上所述,节点将最后一条语句的结果设置为_。您最后一条语句的结果是lodash lib。因此_.isArray([])在下一行中工作,但不会再发生。
马克·卡恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.